Bug 562908 - Populate the JustJ Git clones with initial content

Provide an initial prototype for a model from which  JRE scaffolding can
be generated.
diff --git a/.gitignore b/.gitignore
index 2f7896d..809cc8f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 target/
+bin/
diff --git a/features/org.eclipse.justj.tools-feature/.project b/features/org.eclipse.justj.tools-feature/.project
new file mode 100644
index 0000000..ecbe7b3
--- /dev/null
+++ b/features/org.eclipse.justj.tools-feature/.project
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.tools-feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/features/org.eclipse.justj.tools-feature/build.properties b/features/org.eclipse.justj.tools-feature/build.properties
new file mode 100644
index 0000000..5274509
--- /dev/null
+++ b/features/org.eclipse.justj.tools-feature/build.properties
@@ -0,0 +1,12 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+#
+
+bin.includes = feature.xml,\
+               feature.properties
diff --git a/features/org.eclipse.justj.tools-feature/feature.properties b/features/org.eclipse.justj.tools-feature/feature.properties
new file mode 100644
index 0000000..2f8f0b0
--- /dev/null
+++ b/features/org.eclipse.justj.tools-feature/feature.properties
@@ -0,0 +1,21 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+#
+
+providerName = Eclipse JustJ
+featureName = JustJ Tools
+description = Contains the plug-ins for the Tools
+copyright = Copyright (c) 2020 Eclipse contributors and others.\n\
+\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n\
+\n\
+SPDX-License-Identifier: EPL-2.0\n
diff --git a/features/org.eclipse.justj.tools-feature/feature.xml b/features/org.eclipse.justj.tools-feature/feature.xml
new file mode 100644
index 0000000..258f856
--- /dev/null
+++ b/features/org.eclipse.justj.tools-feature/feature.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<feature
+      id="org.eclipse.justj.tools"
+      label="%featureName"
+      version="0.1.0.qualifier"
+      provider-name="%providerName"
+      license-feature="org.eclipse.license"
+      license-feature-version="0.0.0">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="org.eclipse.justj.tools"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.justj.codegen"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.justj.codegen.edit"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.justj.codegen.editor"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/features/org.eclipse.justj.tools-feature/pom.xml b/features/org.eclipse.justj.tools-feature/pom.xml
new file mode 100644
index 0000000..796db56
--- /dev/null
+++ b/features/org.eclipse.justj.tools-feature/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.features</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.justj.tools.parent/features</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj.features</groupId>
+  <artifactId>org.eclipse.justj.tools</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <packaging>eclipse-feature</packaging>
+</project>
diff --git a/plugins/org.eclipse.justj.codegen.edit/.classpath b/plugins/org.eclipse.justj.codegen.edit/.classpath
new file mode 100644
index 0000000..3bc2475
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.justj.codegen.edit/.project b/plugins/org.eclipse.justj.codegen.edit/.project
new file mode 100644
index 0000000..c016e2c
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.codegen.edit</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen.edit/META-INF/MANIFEST.MF b/plugins/org.eclipse.justj.codegen.edit/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f879f0f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.justj.codegen.edit;singleton:=true
+Automatic-Module-Name: org.eclipse.justj.codegen.edit
+Bundle-Version: 0.1.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.justj.codegen.model.provider.ModelEditPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.justj.codegen.model.provider
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.justj.codegen;visibility:=reexport,
+ org.eclipse.emf.edit;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.justj.codegen.edit/about.html b/plugins/org.eclipse.justj.codegen.edit/about.html
new file mode 100644
index 0000000..164f781
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/about.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>About</title>
+</head>
+<body lang="EN-US">
+	<h2>About This Content</h2>
+
+	<p>November 30, 2017</p>
+	<h3>License</h3>
+
+	<p>
+		The Eclipse Foundation makes available all content in this plug-in
+		(&quot;Content&quot;). Unless otherwise indicated below, the Content
+		is provided to you under the terms and conditions of the Eclipse
+		Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+		available at <a href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+		For purposes of the EPL, &quot;Program&quot; will mean the Content.
+	</p>
+
+	<p>
+		If you did not receive this Content directly from the Eclipse
+		Foundation, the Content is being redistributed by another party
+		(&quot;Redistributor&quot;) and different terms and conditions may
+		apply to your use of any object code in the Content. Check the
+		Redistributor's license that was provided with the Content. If no such
+		license exists, contact the Redistributor. Unless otherwise indicated
+		below, the terms and conditions of the EPL still apply to any source
+		code in the Content and such source code may be obtained at <a
+			href="http://www.eclipse.org/">http://www.eclipse.org</a>.
+	</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.codegen.edit/about.mappings b/plugins/org.eclipse.justj.codegen.edit/about.mappings
new file mode 100644
index 0000000..9c84f0a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/about.mappings
@@ -0,0 +1,2 @@
+0=${build.id}
+1=${git.commit}
diff --git a/plugins/org.eclipse.justj.codegen.edit/build.properties b/plugins/org.eclipse.justj.codegen.edit/build.properties
new file mode 100644
index 0000000..f9f2c35
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/build.properties
@@ -0,0 +1,21 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               about.html,\
+               about.mappings
+jars.compile.order = .
+source.. = src/
+output.. = bin/
+src.includes = about.mappings,\
+               about.html
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Install.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Install.gif
new file mode 100644
index 0000000..2230997
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Install.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Instruction.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Instruction.gif
new file mode 100644
index 0000000..5818a30
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Instruction.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/JVM.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/JVM.gif
new file mode 100644
index 0000000..dd994fd
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/JVM.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Model.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Model.gif
new file mode 100644
index 0000000..cd5e74f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Model.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Touchpoint.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Touchpoint.gif
new file mode 100644
index 0000000..33854e9
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Touchpoint.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Uninstall.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Uninstall.gif
new file mode 100644
index 0000000..9b74ecc
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Uninstall.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Variant.gif b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Variant.gif
new file mode 100644
index 0000000..78eafd8
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/icons/full/obj16/Variant.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.edit/plugin.properties b/plugins/org.eclipse.justj.codegen.edit/plugin.properties
new file mode 100644
index 0000000..d29fe57
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/plugin.properties
@@ -0,0 +1,62 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+
+pluginName = JustJ Codegen Edit Support
+providerName = Eclipse JustJ
+
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} {0}
+_UI_CreateChild_text3 = {1}
+_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
+_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
+_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
+
+_UI_PropertyDescriptor_description = The {0} of the {1}
+
+_UI_Model_type = Model
+_UI_JVM_type = JVM
+_UI_Variant_type = Variant
+_UI_Copyrightable_type = Copyrightable
+_UI_Unknown_type = Object
+
+_UI_Unknown_datatype= Value
+
+_UI_Model_name_feature = Name
+_UI_Model_label_feature = Label
+_UI_Model_jVMs_feature = JVMs
+_UI_Model_provider_feature = Provider
+_UI_Model_providerImageName_feature = Provider Image Name
+_UI_Model_providerImageData_feature = Provider Image Data
+_UI_Model_aboutURL_feature = About URL
+_UI_JVM_name_feature = Name
+_UI_JVM_version_feature = Version
+_UI_JVM_label_feature = Label
+_UI_JVM_variants_feature = Variants
+_UI_JVM_model_feature = Model
+_UI_JVM_aboutTextExtra_feature = About Text Extra
+_UI_Variant_os_feature = Os
+_UI_Variant_arch_feature = Arch
+_UI_Variant_jVM_feature = JVM
+_UI_Variant_label_feature = Label
+_UI_Copyrightable_copyrightHolder_feature = Copyright Holder
+_UI_Copyrightable_copyrightYear_feature = Copyright Year
+_UI_Copyrightable_copyrightText_feature = Copyright Text
+_UI_Unknown_feature = Unspecified
+
+_UI_Model_target_feature = Target
+_UI_Touchpoint_type = Touchpoint
+_UI_Touchable_type = Touchable
+_UI_Touchpoint_phase_feature = Phase
+_UI_Touchpoint_instructions_feature = Instructions
+_UI_Touchable_touchpoints_feature = Touchpoints
+_UI_Phase_Install_literal = install
+_UI_Phase_Uninstall_literal = uninstall
+_UI_Variant_source_feature = Source
+_UI_Model_source_feature = Source
+_UI_Model_localCache_feature = Local Cache
diff --git a/plugins/org.eclipse.justj.codegen.edit/plugin.xml b/plugins/org.eclipse.justj.codegen.edit/plugin.xml
new file mode 100644
index 0000000..105853e
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/plugin.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2020 Eclipse contributors and others.
+ 
+ This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+ 
+ SPDX-License-Identifier: EPL-2.0
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
+      <!-- @generated Model -->
+      <factory
+            uri="http://www.eclipse.org/just/2020/Model"
+            class="org.eclipse.justj.codegen.model.provider.ModelItemProviderAdapterFactory"
+            supportedTypes=
+              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
+               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
+               org.eclipse.emf.edit.provider.ITreeItemContentProvider
+               org.eclipse.emf.edit.provider.IItemLabelProvider
+               org.eclipse.emf.edit.provider.IItemPropertySource"/>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.justj.codegen.edit/pom.xml b/plugins/org.eclipse.justj.codegen.edit/pom.xml
new file mode 100644
index 0000000..a6c43cb
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.plugins</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.justj.tools.parent/plugins</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.codegen.edit</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>about.mappings</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/CopyrightableItemProvider.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/CopyrightableItemProvider.java
new file mode 100644
index 0000000..0a98d9c
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/CopyrightableItemProvider.java
@@ -0,0 +1,220 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+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.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.ModelPackage;
+
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.justj.codegen.model.Copyrightable} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class CopyrightableItemProvider extends ItemProviderAdapter
+  implements
+    IEditingDomainItemProvider,
+    IStructuredItemContentProvider,
+    ITreeItemContentProvider,
+    IItemLabelProvider,
+    IItemPropertySource
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public CopyrightableItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addCopyrightHolderPropertyDescriptor(object);
+      addCopyrightYearPropertyDescriptor(object);
+      addCopyrightTextPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Copyright Holder feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addCopyrightHolderPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Copyrightable_copyrightHolder_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Copyrightable_copyrightHolder_feature", "_UI_Copyrightable_type"),
+        ModelPackage.Literals.COPYRIGHTABLE__COPYRIGHT_HOLDER,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Copyright Year feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addCopyrightYearPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Copyrightable_copyrightYear_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Copyrightable_copyrightYear_feature", "_UI_Copyrightable_type"),
+        ModelPackage.Literals.COPYRIGHTABLE__COPYRIGHT_YEAR,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Copyright Text feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addCopyrightTextPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Copyrightable_copyrightText_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Copyrightable_copyrightText_feature", "_UI_Copyrightable_type"),
+        ModelPackage.Literals.COPYRIGHTABLE__COPYRIGHT_TEXT,
+        true,
+        true,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getText(Object object)
+  {
+    String label = ((Copyrightable)object).getCopyrightHolder();
+    return label == null || label.length() == 0 ? getString("_UI_Copyrightable_type") : getString("_UI_Copyrightable_type") + " " + label;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Copyrightable.class))
+    {
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_HOLDER:
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_YEAR:
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_TEXT:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+        return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+  }
+
+  /**
+   * Return the resource locator for this item provider's resources.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return ModelEditPlugin.INSTANCE;
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/JVMItemProvider.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/JVMItemProvider.java
new file mode 100644
index 0000000..ec81f5a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/JVMItemProvider.java
@@ -0,0 +1,302 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.justj.codegen.model.JVM} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class JVMItemProvider extends CopyrightableItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public JVMItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addNamePropertyDescriptor(object);
+      addVersionPropertyDescriptor(object);
+      addLabelPropertyDescriptor(object);
+      addAboutTextExtraPropertyDescriptor(object);
+      addVariantsPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * 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_JVM_name_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JVM_name_feature", "_UI_JVM_type"),
+        ModelPackage.Literals.JVM__NAME,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Version feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addVersionPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_JVM_version_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JVM_version_feature", "_UI_JVM_type"),
+        ModelPackage.Literals.JVM__VERSION,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Label feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addLabelPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_JVM_label_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JVM_label_feature", "_UI_JVM_type"),
+        ModelPackage.Literals.JVM__LABEL,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Variants feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addVariantsPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_JVM_variants_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JVM_variants_feature", "_UI_JVM_type"),
+        ModelPackage.Literals.JVM__VARIANTS,
+        true,
+        false,
+        true,
+        null,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the About Text Extra feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addAboutTextExtraPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_JVM_aboutTextExtra_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_JVM_aboutTextExtra_feature", "_UI_JVM_type"),
+        ModelPackage.Literals.JVM__ABOUT_TEXT_EXTRA,
+        true,
+        true,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(ModelPackage.Literals.TOUCHABLE__TOUCHPOINTS);
+      childrenFeatures.add(ModelPackage.Literals.JVM__VARIANTS);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * This returns JVM.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/JVM"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public String getText(Object object)
+  {
+    JVM jvm = (JVM)object;
+    String name = jvm.getName();
+    String label = jvm.getLabel();
+    return "" + name + " - " + label;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(JVM.class))
+    {
+      case ModelPackage.JVM__NAME:
+      case ModelPackage.JVM__VERSION:
+      case ModelPackage.JVM__LABEL:
+      case ModelPackage.JVM__ABOUT_TEXT_EXTRA:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+        return;
+      case ModelPackage.JVM__TOUCHPOINTS:
+      case ModelPackage.JVM__VARIANTS:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+        return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(ModelPackage.Literals.TOUCHABLE__TOUCHPOINTS, ModelFactory.eINSTANCE.createTouchpoint()));
+
+    newChildDescriptors.add(createChildParameter(ModelPackage.Literals.JVM__VARIANTS, ModelFactory.eINSTANCE.createVariant()));
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelEditPlugin.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelEditPlugin.java
new file mode 100644
index 0000000..27d0697
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelEditPlugin.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+
+
+/**
+ * This is the central singleton for the Model edit plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ModelEditPlugin extends EMFPlugin
+{
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final ModelEditPlugin INSTANCE = new ModelEditPlugin();
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static Implementation plugin;
+
+  /**
+   * Create the instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelEditPlugin()
+  {
+    super(new ResourceLocator []{});
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  @Override
+  public ResourceLocator getPluginResourceLocator()
+  {
+    return plugin;
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  public static Implementation getPlugin()
+  {
+    return plugin;
+  }
+
+  /**
+   * The actual implementation of the Eclipse <b>Plugin</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static class Implementation extends EclipsePlugin
+  {
+    /**
+    	 * Creates an instance.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public Implementation()
+    {
+      super();
+
+      // Remember the static instance.
+      //
+      plugin = this;
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelItemProvider.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelItemProvider.java
new file mode 100644
index 0000000..2ef2133
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelItemProvider.java
@@ -0,0 +1,403 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.justj.codegen.model.Model} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelItemProvider extends CopyrightableItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addNamePropertyDescriptor(object);
+      addLabelPropertyDescriptor(object);
+      addProviderPropertyDescriptor(object);
+      addProviderImageNamePropertyDescriptor(object);
+      addProviderImageDataPropertyDescriptor(object);
+      addAboutURLPropertyDescriptor(object);
+      addTargetPropertyDescriptor(object);
+      addSourcePropertyDescriptor(object);
+      addLocalCachePropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * 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_Model_name_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_name_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__NAME,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Label feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addLabelPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_label_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_label_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__LABEL,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Provider feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addProviderPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_provider_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_provider_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__PROVIDER,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Provider Image Name feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addProviderImageNamePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_providerImageName_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_providerImageName_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__PROVIDER_IMAGE_NAME,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Provider Image Data feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addProviderImageDataPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_providerImageData_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_providerImageData_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__PROVIDER_IMAGE_DATA,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the About URL feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addAboutURLPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_aboutURL_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_aboutURL_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__ABOUT_URL,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Target feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addTargetPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_target_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_target_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__TARGET,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Source feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addSourcePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_source_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_source_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__SOURCE,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Local Cache feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addLocalCachePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Model_localCache_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Model_localCache_feature", "_UI_Model_type"),
+        ModelPackage.Literals.MODEL__LOCAL_CACHE,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(ModelPackage.Literals.TOUCHABLE__TOUCHPOINTS);
+      childrenFeatures.add(ModelPackage.Literals.MODEL__JV_MS);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * This returns Model.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/Model"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public String getText(Object object)
+  {
+    Model model = (Model)object;
+    String name = model.getName();
+    String label = model.getLabel();
+    return "" + name + " - " + label;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Model.class))
+    {
+      case ModelPackage.MODEL__NAME:
+      case ModelPackage.MODEL__LABEL:
+      case ModelPackage.MODEL__PROVIDER:
+      case ModelPackage.MODEL__PROVIDER_IMAGE_NAME:
+      case ModelPackage.MODEL__PROVIDER_IMAGE_DATA:
+      case ModelPackage.MODEL__ABOUT_URL:
+      case ModelPackage.MODEL__TARGET:
+      case ModelPackage.MODEL__SOURCE:
+      case ModelPackage.MODEL__LOCAL_CACHE:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+        return;
+      case ModelPackage.MODEL__TOUCHPOINTS:
+      case ModelPackage.MODEL__JV_MS:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+        return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(ModelPackage.Literals.TOUCHABLE__TOUCHPOINTS, ModelFactory.eINSTANCE.createTouchpoint()));
+
+    newChildDescriptors.add(createChildParameter(ModelPackage.Literals.MODEL__JV_MS, ModelFactory.eINSTANCE.createJVM()));
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelItemProviderAdapterFactory.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelItemProviderAdapterFactory.java
new file mode 100644
index 0000000..94d2632
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/ModelItemProviderAdapterFactory.java
@@ -0,0 +1,319 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.justj.codegen.model.util.ModelAdapterFactory;
+
+
+/**
+ * This is the factory that is used to provide the interfaces needed to support Viewers.
+ * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
+ * The adapters also support Eclipse property sheets.
+ * Note that most of the adapters are shared among multiple instances.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelItemProviderAdapterFactory extends ModelAdapterFactory implements ComposeableAdapterFactory, IChangeNotifier, IDisposable
+{
+  /**
+   * This keeps track of the root adapter factory that delegates to this adapter factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ComposedAdapterFactory parentAdapterFactory;
+
+  /**
+   * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IChangeNotifier changeNotifier = new ChangeNotifier();
+
+  /**
+   * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Object> supportedTypes = new ArrayList<Object>();
+
+  /**
+   * This constructs an instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelItemProviderAdapterFactory()
+  {
+    supportedTypes.add(IEditingDomainItemProvider.class);
+    supportedTypes.add(IStructuredItemContentProvider.class);
+    supportedTypes.add(ITreeItemContentProvider.class);
+    supportedTypes.add(IItemLabelProvider.class);
+    supportedTypes.add(IItemPropertySource.class);
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.justj.codegen.model.Model} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelItemProvider modelItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.justj.codegen.model.Model}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createModelAdapter()
+  {
+    if (modelItemProvider == null)
+    {
+      modelItemProvider = new ModelItemProvider(this);
+    }
+
+    return modelItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.justj.codegen.model.JVM} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected JVMItemProvider jvmItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.justj.codegen.model.JVM}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createJVMAdapter()
+  {
+    if (jvmItemProvider == null)
+    {
+      jvmItemProvider = new JVMItemProvider(this);
+    }
+
+    return jvmItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.justj.codegen.model.Variant} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected VariantItemProvider variantItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.justj.codegen.model.Variant}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createVariantAdapter()
+  {
+    if (variantItemProvider == null)
+    {
+      variantItemProvider = new VariantItemProvider(this);
+    }
+
+    return variantItemProvider;
+  }
+
+  /**
+   * This keeps track of the one adapter used for all {@link org.eclipse.justj.codegen.model.Touchpoint} instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TouchpointItemProvider touchpointItemProvider;
+
+  /**
+   * This creates an adapter for a {@link org.eclipse.justj.codegen.model.Touchpoint}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter createTouchpointAdapter()
+  {
+    if (touchpointItemProvider == null)
+    {
+      touchpointItemProvider = new TouchpointItemProvider(this);
+    }
+
+    return touchpointItemProvider;
+  }
+
+  /**
+   * This returns the root adapter factory that contains this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ComposeableAdapterFactory getRootAdapterFactory()
+  {
+    return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
+  }
+
+  /**
+   * This sets the composed adapter factory that contains this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)
+  {
+    this.parentAdapterFactory = parentAdapterFactory;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean isFactoryForType(Object type)
+  {
+    return supportedTypes.contains(type) || super.isFactoryForType(type);
+  }
+
+  /**
+   * This implementation substitutes the factory itself as the key for the adapter.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Adapter adapt(Notifier notifier, Object type)
+  {
+    return super.adapt(notifier, this);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object adapt(Object object, Object type)
+  {
+    if (isFactoryForType(type))
+    {
+      Object adapter = super.adapt(object, type);
+      if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter)))
+      {
+        return adapter;
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * This adds a listener.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void addListener(INotifyChangedListener notifyChangedListener)
+  {
+    changeNotifier.addListener(notifyChangedListener);
+  }
+
+  /**
+   * This removes a listener.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void removeListener(INotifyChangedListener notifyChangedListener)
+  {
+    changeNotifier.removeListener(notifyChangedListener);
+  }
+
+  /**
+   * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void fireNotifyChanged(Notification notification)
+  {
+    changeNotifier.fireNotifyChanged(notification);
+
+    if (parentAdapterFactory != null)
+    {
+      parentAdapterFactory.fireNotifyChanged(notification);
+    }
+  }
+
+  /**
+   * This disposes all of the item providers created by this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void dispose()
+  {
+    if (modelItemProvider != null)
+    {
+      modelItemProvider.dispose();
+    }
+    if (jvmItemProvider != null)
+    {
+      jvmItemProvider.dispose();
+    }
+    if (variantItemProvider != null)
+    {
+      variantItemProvider.dispose();
+    }
+    if (touchpointItemProvider != null)
+    {
+      touchpointItemProvider.dispose();
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/TouchpointItemProvider.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/TouchpointItemProvider.java
new file mode 100644
index 0000000..ddd4577
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/TouchpointItemProvider.java
@@ -0,0 +1,318 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+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.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.EMFEditPlugin;
+import org.eclipse.emf.edit.provider.AttributeValueWrapperItemProvider;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.ComposedImage;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.IUpdateableItemText;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemProviderAdapter;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Phase;
+import org.eclipse.justj.codegen.model.Touchpoint;
+
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.justj.codegen.model.Touchpoint} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class TouchpointItemProvider extends ItemProviderAdapter
+  implements
+    IEditingDomainItemProvider,
+    IStructuredItemContentProvider,
+    ITreeItemContentProvider,
+    IItemLabelProvider,
+    IItemPropertySource
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public TouchpointItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addPhasePropertyDescriptor(object);
+      addInstructionsPropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Phase feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addPhasePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Touchpoint_phase_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Touchpoint_phase_feature", "_UI_Touchpoint_type"),
+        ModelPackage.Literals.TOUCHPOINT__PHASE,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Instructions feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addInstructionsPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Touchpoint_instructions_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Touchpoint_instructions_feature", "_UI_Touchpoint_type"),
+        ModelPackage.Literals.TOUCHPOINT__INSTRUCTIONS,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(ModelPackage.Literals.TOUCHPOINT__INSTRUCTIONS);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * This returns Touchpoint.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    Touchpoint touchpoint = (Touchpoint)object;
+    Phase phase = touchpoint.getPhase();
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/" + phase.getName()));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public String getText(Object object)
+  {
+    Touchpoint touchpoint = (Touchpoint)object;
+    return touchpoint.getPhase().getLiteral();
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Touchpoint.class))
+    {
+      case ModelPackage.TOUCHPOINT__PHASE:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+        return;
+      case ModelPackage.TOUCHPOINT__INSTRUCTIONS:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+        return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(ModelPackage.Literals.TOUCHPOINT__INSTRUCTIONS, ""));
+  }
+
+  /**
+   * Return the resource locator for this item provider's resources.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ResourceLocator getResourceLocator()
+  {
+    return ModelEditPlugin.INSTANCE;
+  }
+
+  @Override
+  public Object getCreateChildImage(Object owner, Object feature, Object child, Collection<?> selection)
+  {
+    List<Object> images = new ArrayList<Object>();
+    images.add(getImage("full/obj16/Instruction"));
+    images.add(EMFEditPlugin.INSTANCE.getImage("full/ovr16/CreateChild"));
+    return new ChildCreationComposedImage(images);
+  }
+
+  @Override
+  public String getCreateChildText(Object owner, Object feature, Object child, Collection<?> selection)
+  {
+    return "Instruction";
+  }
+
+  private static final class ChildCreationComposedImage extends ComposedImage
+  {
+    private ChildCreationComposedImage(Collection<?> images)
+    {
+      super(images);
+    }
+
+    @Override
+    public List<Point> getDrawPoints(Size size)
+    {
+      List<Point> result = super.getDrawPoints(size);
+      result.get(1).x = size.width - 7;
+      return result;
+    }
+  }
+
+  @Override
+  protected Object createWrapper(EObject object, EStructuralFeature feature, Object value, int index)
+  {
+    if (feature == ModelPackage.Literals.TOUCHPOINT__INSTRUCTIONS)
+    {
+      return new Instruction(value, object, index, adapterFactory, getResourceLocator());
+    }
+    else
+    {
+      return super.createWrapper(object, feature, value, index);
+    }
+  }
+
+  private static class Instruction extends AttributeValueWrapperItemProvider implements IUpdateableItemText
+  {
+    public Instruction(Object value, EObject owner, int index, AdapterFactory adapterFactory, ResourceLocator resourceLocator)
+    {
+      super(value, owner, ModelPackage.Literals.TOUCHPOINT__INSTRUCTIONS, index, adapterFactory, resourceLocator);
+    }
+
+    @Override
+    public void setText(Object object, String text)
+    {
+      List<IItemPropertyDescriptor> propertyDescriptors = getPropertyDescriptors(object);
+      propertyDescriptors.get(0).setPropertyValue(object, text);
+    }
+
+    @Override
+    public Object getImage(Object object)
+    {
+      return resourceLocator.getImage("full/obj16/Instruction");
+    }
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/VariantItemProvider.java b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/VariantItemProvider.java
new file mode 100644
index 0000000..bc5735d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.edit/src/org/eclipse/justj/codegen/model/provider/VariantItemProvider.java
@@ -0,0 +1,274 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.justj.codegen.model.Variant} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class VariantItemProvider extends CopyrightableItemProvider
+{
+  /**
+   * This constructs an instance from a factory and a notifier.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public VariantItemProvider(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  /**
+   * This returns the property descriptors for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object)
+  {
+    if (itemPropertyDescriptors == null)
+    {
+      super.getPropertyDescriptors(object);
+
+      addOsPropertyDescriptor(object);
+      addArchPropertyDescriptor(object);
+      addLabelPropertyDescriptor(object);
+      addSourcePropertyDescriptor(object);
+    }
+    return itemPropertyDescriptors;
+  }
+
+  /**
+   * This adds a property descriptor for the Os feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addOsPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Variant_os_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Variant_os_feature", "_UI_Variant_type"),
+        ModelPackage.Literals.VARIANT__OS,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Arch feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addArchPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Variant_arch_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Variant_arch_feature", "_UI_Variant_type"),
+        ModelPackage.Literals.VARIANT__ARCH,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Label feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addLabelPropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Variant_label_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Variant_label_feature", "_UI_Variant_type"),
+        ModelPackage.Literals.VARIANT__LABEL,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This adds a property descriptor for the Source feature.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addSourcePropertyDescriptor(Object object)
+  {
+    itemPropertyDescriptors.add(
+      createItemPropertyDescriptor(
+        ((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+        getResourceLocator(),
+        getString("_UI_Variant_source_feature"),
+        getString("_UI_PropertyDescriptor_description", "_UI_Variant_source_feature", "_UI_Variant_type"),
+        ModelPackage.Literals.VARIANT__SOURCE,
+        true,
+        false,
+        false,
+        ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+        null,
+        null));
+  }
+
+  /**
+   * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+   * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+   * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object)
+  {
+    if (childrenFeatures == null)
+    {
+      super.getChildrenFeatures(object);
+      childrenFeatures.add(ModelPackage.Literals.TOUCHABLE__TOUCHPOINTS);
+    }
+    return childrenFeatures;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EStructuralFeature getChildFeature(Object object, Object child)
+  {
+    // Check the type of the specified child object and return the proper feature to use for
+    // adding (see {@link AddCommand}) it as a child.
+
+    return super.getChildFeature(object, child);
+  }
+
+  /**
+   * This returns Variant.gif.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object getImage(Object object)
+  {
+    return overlayImage(object, getResourceLocator().getImage("full/obj16/Variant"));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean shouldComposeCreationImage()
+  {
+    return true;
+  }
+
+  /**
+   * This returns the label text for the adapted class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public String getText(Object object)
+  {
+    Variant variant = (Variant)object;
+    String os = variant.getOs();
+    String arch = variant.getArch();
+    String label = variant.getLabel();
+    return "" + os + '.' + arch + " - " + label;
+  }
+
+  /**
+   * This handles model notifications by calling {@link #updateChildren} to update any cached
+   * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void notifyChanged(Notification notification)
+  {
+    updateChildren(notification);
+
+    switch (notification.getFeatureID(Variant.class))
+    {
+      case ModelPackage.VARIANT__OS:
+      case ModelPackage.VARIANT__ARCH:
+      case ModelPackage.VARIANT__LABEL:
+      case ModelPackage.VARIANT__SOURCE:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+        return;
+      case ModelPackage.VARIANT__TOUCHPOINTS:
+        fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+        return;
+    }
+    super.notifyChanged(notification);
+  }
+
+  /**
+   * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+   * that can be created under this object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object)
+  {
+    super.collectNewChildDescriptors(newChildDescriptors, object);
+
+    newChildDescriptors.add(createChildParameter(ModelPackage.Literals.TOUCHABLE__TOUCHPOINTS, ModelFactory.eINSTANCE.createTouchpoint()));
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen.editor/.classpath b/plugins/org.eclipse.justj.codegen.editor/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.justj.codegen.editor/.project b/plugins/org.eclipse.justj.codegen.editor/.project
new file mode 100644
index 0000000..4bfc3c4
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.codegen.editor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen.editor/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.justj.codegen.editor/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9f6ece8
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/plugins/org.eclipse.justj.codegen.editor/META-INF/MANIFEST.MF b/plugins/org.eclipse.justj.codegen.editor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..9c435b3
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.justj.codegen.editor;singleton:=true
+Automatic-Module-Name: org.eclipse.justj.codegen.editor
+Bundle-Version: 0.1.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.justj.codegen.model.presentation.ModelEditorPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.justj.codegen.model.presentation
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.core.resources;visibility:=reexport,
+ org.eclipse.justj.codegen.edit;visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.eclipse.emf.edit.ui;visibility:=reexport,
+ org.eclipse.jface.text,
+ org.eclipse.ui.ide;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.justj.codegen.editor/about.html b/plugins/org.eclipse.justj.codegen.editor/about.html
new file mode 100644
index 0000000..164f781
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/about.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>About</title>
+</head>
+<body lang="EN-US">
+	<h2>About This Content</h2>
+
+	<p>November 30, 2017</p>
+	<h3>License</h3>
+
+	<p>
+		The Eclipse Foundation makes available all content in this plug-in
+		(&quot;Content&quot;). Unless otherwise indicated below, the Content
+		is provided to you under the terms and conditions of the Eclipse
+		Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+		available at <a href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+		For purposes of the EPL, &quot;Program&quot; will mean the Content.
+	</p>
+
+	<p>
+		If you did not receive this Content directly from the Eclipse
+		Foundation, the Content is being redistributed by another party
+		(&quot;Redistributor&quot;) and different terms and conditions may
+		apply to your use of any object code in the Content. Check the
+		Redistributor's license that was provided with the Content. If no such
+		license exists, contact the Redistributor. Unless otherwise indicated
+		below, the terms and conditions of the EPL still apply to any source
+		code in the Content and such source code may be obtained at <a
+			href="http://www.eclipse.org/">http://www.eclipse.org</a>.
+	</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.codegen.editor/about.mappings b/plugins/org.eclipse.justj.codegen.editor/about.mappings
new file mode 100644
index 0000000..9c84f0a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/about.mappings
@@ -0,0 +1,2 @@
+0=${build.id}
+1=${git.commit}
diff --git a/plugins/org.eclipse.justj.codegen.editor/build.properties b/plugins/org.eclipse.justj.codegen.editor/build.properties
new file mode 100644
index 0000000..a9d3063
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/build.properties
@@ -0,0 +1,21 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+
+bin.includes = .,\
+               icons/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               about.mappings,\
+               about.html
+jars.compile.order = .
+source.. = src/
+output.. = bin
+src.includes = about.mappings,\
+               about.html
diff --git a/plugins/org.eclipse.justj.codegen.editor/icons/full/obj16/ModelModelFile.gif b/plugins/org.eclipse.justj.codegen.editor/icons/full/obj16/ModelModelFile.gif
new file mode 100644
index 0000000..cd5e74f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/icons/full/obj16/ModelModelFile.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.editor/icons/full/wizban/NewModel.gif b/plugins/org.eclipse.justj.codegen.editor/icons/full/wizban/NewModel.gif
new file mode 100644
index 0000000..b2beab0
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/icons/full/wizban/NewModel.gif
Binary files differ
diff --git a/plugins/org.eclipse.justj.codegen.editor/plugin.properties b/plugins/org.eclipse.justj.codegen.editor/plugin.properties
new file mode 100644
index 0000000..ac741d2
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/plugin.properties
@@ -0,0 +1,53 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+
+pluginName = JustJ Codegen Editor
+providerName = Eclipse JustJ
+
+_UI_ModelEditor_menu = &JRE Generator Editor
+
+_UI_CreateChild_menu_item = &New Child
+_UI_CreateSibling_menu_item = N&ew Sibling
+
+_UI_ShowPropertiesView_menu_item = Show &Properties View
+_UI_RefreshViewer_menu_item = &Refresh
+
+_UI_SelectionPage_label = Selection
+
+_UI_NoObjectSelected = Selected Nothing
+_UI_SingleObjectSelected = Selected Object: {0}
+_UI_MultiObjectSelected = Selected {0} Objects
+
+_UI_OpenEditorError_label = Open Editor
+
+_UI_Wizard_category = JustJ Tools Creation Wizards
+
+_UI_CreateModelError_message = Problems encountered in file "{0}"
+
+_UI_ModelModelWizard_label = JRE Generator Model
+_UI_ModelModelWizard_description = Create a new JRE Generator model
+
+_UI_ModelEditor_label =  JRE Generator Editor
+
+_UI_ModelEditorFilenameDefaultBase = My
+_UI_ModelEditorFilenameExtensions = jregen
+
+_UI_Wizard_label = New
+
+_WARN_FilenameExtension = The file name must end in ''.{0}''
+_WARN_FilenameExtensions = The file name must have one of the following extensions: {0}
+
+_UI_ModelObject = &Model Object
+_UI_XMLEncoding = &XML Encoding
+_UI_XMLEncodingChoices = UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1
+_UI_Wizard_initial_object_description = Select a model object to create
+
+_UI_FileConflict_label = File Conflict
+_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?
+
diff --git a/plugins/org.eclipse.justj.codegen.editor/plugin.xml b/plugins/org.eclipse.justj.codegen.editor/plugin.xml
new file mode 100644
index 0000000..4672959
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/plugin.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2020 Eclipse contributors and others.
+ 
+ This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+ 
+ SPDX-License-Identifier: EPL-2.0
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.ui.newWizards">
+      <!-- @generated Model NOT -->
+      <category
+            id="org.eclipse.justj.codegen.Wizard.category.ID"
+            name="%_UI_Wizard_category"/>
+      <wizard
+            id="org.eclipse.justj.codegen.model.presentation.ModelModelWizardID"
+            name="%_UI_ModelModelWizard_label"
+            class="org.eclipse.justj.codegen.model.presentation.ModelModelWizard"
+            category="org.eclipse.justj.codegen.Wizard.category.ID"
+            icon="icons/full/obj16/ModelModelFile.gif">
+         <description>%_UI_ModelModelWizard_description</description>
+         <selection class="org.eclipse.core.resources.IResource"/>
+      </wizard>
+   </extension>
+
+   <extension point="org.eclipse.ui.editors">
+      <!-- @generated Model -->
+      <editor
+            id="org.eclipse.justj.codegen.model.presentation.ModelEditorID"
+            name="%_UI_ModelEditor_label"
+            icon="icons/full/obj16/ModelModelFile.gif"
+            class="org.eclipse.justj.codegen.model.presentation.ModelEditor"
+            contributorClass="org.eclipse.justj.codegen.model.presentation.ModelActionBarContributor">
+         <contentTypeBinding contentTypeId="org.eclipse.justj.codegen"/>
+      </editor>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.justj.codegen.editor/pom.xml b/plugins/org.eclipse.justj.codegen.editor/pom.xml
new file mode 100644
index 0000000..f6a1d93
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.plugins</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.justj.tools.parent/plugins</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.codegen.editor</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>about.mappings</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelActionBarContributor.java b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelActionBarContributor.java
new file mode 100644
index 0000000..70bfd24
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelActionBarContributor.java
@@ -0,0 +1,627 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.presentation;
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.command.ChangeCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.emf.edit.ui.action.CollapseAllAction;
+import org.eclipse.emf.edit.ui.action.ControlAction;
+import org.eclipse.emf.edit.ui.action.CreateChildAction;
+import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+import org.eclipse.emf.edit.ui.action.ExpandAllAction;
+import org.eclipse.emf.edit.ui.action.FindAction;
+import org.eclipse.emf.edit.ui.action.LoadResourceAction;
+import org.eclipse.emf.edit.ui.action.RevertAction;
+import org.eclipse.emf.edit.ui.action.ValidateAction;
+import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.action.SubContributionItem;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.util.Generator;
+import org.eclipse.justj.codegen.model.util.Reconciler;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.PartInitException;
+
+
+/**
+ * This is the action bar contributor for the Model model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener
+{
+  /**
+   * This keeps track of the active editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IEditorPart activeEditorPart;
+
+  /**
+   * This keeps track of the current selection provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ISelectionProvider selectionProvider;
+
+  /**
+   * This action opens the Properties view.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IAction showPropertiesViewAction = new Action(ModelEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item"))
+    {
+      @Override
+      public void run()
+      {
+        try
+        {
+          getPage().showView("org.eclipse.ui.views.PropertySheet");
+        }
+        catch (PartInitException exception)
+        {
+          ModelEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+    };
+
+  /**
+   * This action refreshes the viewer of the current editor if the editor
+   * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IAction refreshViewerAction = new Action(ModelEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item"))
+    {
+      @Override
+      public boolean isEnabled()
+      {
+        return activeEditorPart instanceof IViewerProvider;
+      }
+
+      @Override
+      public void run()
+      {
+        if (activeEditorPart instanceof IViewerProvider)
+        {
+          Viewer viewer = ((IViewerProvider)activeEditorPart).getViewer();
+          if (viewer != null)
+          {
+            viewer.refresh();
+          }
+        }
+      }
+    };
+
+  /**
+   * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor
+   * generated for the current selection by the item provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<IAction> createChildActions;
+
+  /**
+   * This is the menu manager into which menu contribution items should be added for CreateChild actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IMenuManager createChildMenuManager;
+
+  /**
+   * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor
+   * generated for the current selection by the item provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<IAction> createSiblingActions;
+
+  /**
+   * This is the menu manager into which menu contribution items should be added for CreateSibling actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IMenuManager createSiblingMenuManager;
+
+  protected GenerateAction generateAction = new GenerateAction();
+
+  protected ReconcileAction reconcileAction = new ReconcileAction();
+
+  /**
+   * This creates an instance of the contributor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelActionBarContributor()
+  {
+    super(ADDITIONS_LAST_STYLE);
+    loadResourceAction = new LoadResourceAction();
+    validateAction = new ValidateAction();
+    liveValidationAction = new DiagnosticDecorator.LiveValidator.LiveValidationAction(ModelEditorPlugin.getPlugin().getDialogSettings());
+    controlAction = new ControlAction();
+    findAction = FindAction.create();
+    revertAction = new RevertAction();
+    expandAllAction = new ExpandAllAction();
+    collapseAllAction = new CollapseAllAction();
+  }
+
+  /**
+   * This adds Separators for editor additions to the tool bar.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void contributeToToolBar(IToolBarManager toolBarManager)
+  {
+    super.contributeToToolBar(toolBarManager);
+    toolBarManager.add(new Separator("model-settings"));
+    toolBarManager.add(new Separator("model-additions"));
+  }
+
+  /**
+   * This adds to the menu bar a menu and some separators for editor additions,
+   * as well as the sub-menus for object creation items.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void contributeToMenu(IMenuManager menuManager)
+  {
+    super.contributeToMenu(menuManager);
+
+    IMenuManager submenuManager = new MenuManager(ModelEditorPlugin.INSTANCE.getString("_UI_ModelEditor_menu"), "org.eclipse.justj.codegen.modelMenuID");
+    menuManager.insertAfter("additions", submenuManager);
+    submenuManager.add(new Separator("settings"));
+    submenuManager.add(new Separator("actions"));
+    submenuManager.add(new Separator("additions"));
+    submenuManager.add(new Separator("additions-end"));
+
+    // Prepare for CreateChild item addition or removal.
+    //
+    createChildMenuManager = new MenuManager(ModelEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
+    submenuManager.insertBefore("additions", createChildMenuManager);
+
+    // Prepare for CreateSibling item addition or removal.
+    //
+    createSiblingMenuManager = new MenuManager(ModelEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
+    submenuManager.insertBefore("additions", createSiblingMenuManager);
+
+    // Force an update because Eclipse hides empty menus now.
+    //
+    submenuManager.addMenuListener(new IMenuListener()
+      {
+        @Override
+        public void menuAboutToShow(IMenuManager menuManager)
+        {
+          menuManager.updateAll(true);
+        }
+      });
+
+    addGlobalActions(submenuManager);
+  }
+
+  /**
+   * When the active editor changes, this remembers the change and registers with it as a selection provider.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setActiveEditor(IEditorPart part)
+  {
+    super.setActiveEditor(part);
+    activeEditorPart = part;
+
+    // Switch to the new selection provider.
+    //
+    if (selectionProvider != null)
+    {
+      selectionProvider.removeSelectionChangedListener(this);
+    }
+    if (part == null)
+    {
+      selectionProvider = null;
+    }
+    else
+    {
+      selectionProvider = part.getSite().getSelectionProvider();
+      selectionProvider.addSelectionChangedListener(this);
+
+      // Fake a selection changed event to update the menus.
+      //
+      if (selectionProvider.getSelection() != null)
+      {
+        selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection()));
+      }
+    }
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},
+   * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings
+   * that can be added to the selected object and updating the menus accordingly.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+    // Remove any menu items for old selection.
+    //
+    if (createChildMenuManager != null)
+    {
+      depopulateManager(createChildMenuManager, createChildActions);
+    }
+    if (createSiblingMenuManager != null)
+    {
+      depopulateManager(createSiblingMenuManager, createSiblingActions);
+    }
+
+    // Query the new selection for appropriate new child/sibling descriptors
+    //
+    Collection<?> newChildDescriptors = null;
+    Collection<?> newSiblingDescriptors = null;
+
+    ISelection selection = event.getSelection();
+    if (selection instanceof IStructuredSelection && ((IStructuredSelection)selection).size() == 1)
+    {
+      Object object = ((IStructuredSelection)selection).getFirstElement();
+
+      EditingDomain domain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
+
+      newChildDescriptors = domain.getNewChildDescriptors(object, null);
+      newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
+    }
+
+    // Generate actions for selection; populate and redraw the menus.
+    //
+    createChildActions = generateCreateChildActions(newChildDescriptors, selection);
+    createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
+
+    if (createChildMenuManager != null)
+    {
+      populateManager(createChildMenuManager, createChildActions, null);
+      createChildMenuManager.update(true);
+    }
+    if (createSiblingMenuManager != null)
+    {
+      populateManager(createSiblingMenuManager, createSiblingActions, null);
+      createSiblingMenuManager.update(true);
+    }
+  }
+
+  /**
+   * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in <code>descriptors</code>,
+   * and returns the collection of these actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection)
+  {
+    Collection<IAction> actions = new ArrayList<IAction>();
+    if (descriptors != null)
+    {
+      for (Object descriptor : descriptors)
+      {
+        actions.add(new CreateChildAction(activeEditorPart, selection, descriptor));
+      }
+    }
+    return actions;
+  }
+
+  /**
+   * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in <code>descriptors</code>,
+   * and returns the collection of these actions.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection)
+  {
+    Collection<IAction> actions = new ArrayList<IAction>();
+    if (descriptors != null)
+    {
+      for (Object descriptor : descriptors)
+      {
+        actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor));
+      }
+    }
+    return actions;
+  }
+
+  /**
+   * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s
+   * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,
+   * by inserting them before the specified contribution item <code>contributionID</code>.
+   * If <code>contributionID</code> is <code>null</code>, they are simply added.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID)
+  {
+    if (actions != null)
+    {
+      for (IAction action : actions)
+      {
+        if (contributionID != null)
+        {
+          manager.insertBefore(contributionID, action);
+        }
+        else
+        {
+          manager.add(action);
+        }
+      }
+    }
+  }
+
+  /**
+   * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s
+   * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions)
+  {
+    if (actions != null)
+    {
+      IContributionItem[] items = manager.getItems();
+      for (int i = 0; i < items.length; i++)
+      {
+        // Look into SubContributionItems
+        //
+        IContributionItem contributionItem = items[i];
+        while (contributionItem instanceof SubContributionItem)
+        {
+          contributionItem = ((SubContributionItem)contributionItem).getInnerItem();
+        }
+
+        // Delete the ActionContributionItems with matching action.
+        //
+        if (contributionItem instanceof ActionContributionItem)
+        {
+          IAction action = ((ActionContributionItem)contributionItem).getAction();
+          if (actions.contains(action))
+          {
+            manager.remove(contributionItem);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * This populates the pop-up menu before it appears.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void menuAboutToShow(IMenuManager menuManager)
+  {
+    super.menuAboutToShow(menuManager);
+    MenuManager submenuManager = null;
+
+    submenuManager = new MenuManager(ModelEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
+    populateManager(submenuManager, createChildActions, null);
+    menuManager.insertBefore("edit", submenuManager);
+
+    submenuManager = new MenuManager(ModelEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
+    populateManager(submenuManager, createSiblingActions, null);
+    menuManager.insertBefore("edit", submenuManager);
+  }
+
+  /**
+   * This inserts global actions before the "additions-end" separator.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void addGlobalActionsGen(IMenuManager menuManager)
+  {
+    menuManager.insertAfter("additions-end", new Separator("ui-actions"));
+    menuManager.insertAfter("ui-actions", showPropertiesViewAction);
+
+    refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
+    menuManager.insertAfter("ui-actions", refreshViewerAction);
+
+    super.addGlobalActions(menuManager);
+  }
+
+  @Override
+  public void addGlobalActions(IMenuManager menuManager)
+  {
+    addGlobalActionsGen(menuManager);
+    boolean hasSettings = menuManager.find("settings") != null;
+    menuManager.insertBefore(hasSettings ? "settings" : "edit", generateAction);
+    menuManager.insertBefore(hasSettings ? "settings" : "edit", reconcileAction);
+    if (!hasSettings)
+    {
+      menuManager.insertBefore("edit", new Separator());
+    }
+  }
+
+  /**
+   * This ensures that a delete action will clean up all references to deleted objects.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected boolean removeAllReferencesOnDelete()
+  {
+    return true;
+  }
+
+  private class GenerateAction extends Action
+  {
+    public GenerateAction()
+    {
+      super("&Generate");
+    }
+
+    @Override
+    public void run()
+    {
+      Model model = (Model)((IEditingDomainProvider)activeEditorPart).getEditingDomain().getResourceSet().getResources().get(0).getContents().get(0);
+
+      System.err.println("###" + model.eResource().getURI());
+      System.err.println("###" + model.getTarget());
+      Generator generator = new Generator(model);
+      System.err.println("###>" + generator.getTarget());
+
+      Shell shell = activeEditorPart.getSite().getShell();
+      if (MessageDialog.openConfirm(shell, "Generator Confirmation", "The results will be generated to '" + generator.getTarget() + "'"))
+      {
+        try
+        {
+          new ProgressMonitorDialog(activeEditorPart.getSite().getShell()).run(true, true, monitor ->
+            {
+              try
+              {
+                generator.generate(monitor);
+                ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, monitor);
+              }
+              catch (Exception exception)
+              {
+                new InvocationTargetException(exception);
+              }
+            });
+        }
+        catch (Exception exception)
+        {
+          ModelEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+    }
+  }
+
+  private class ReconcileAction extends Action
+  {
+    public ReconcileAction()
+    {
+      super("&Reconcile");
+    }
+
+    @Override
+    public void run()
+    {
+      EditingDomain editingDomain = ((IEditingDomainProvider)activeEditorPart).getEditingDomain();
+      Model model = (Model)editingDomain.getResourceSet().getResources().get(0).getContents().get(0);
+
+      System.err.println("###" + model.eResource().getURI());
+      System.err.println("###" + model.getTarget());
+      Reconciler reconciler = new Reconciler(model);
+
+      Shell shell = activeEditorPart.getSite().getShell();
+      if (MessageDialog.openConfirm(shell, "Reconciler Confirmation", "The model will be updated from '" + reconciler.getSource() + "'"))
+      {
+        AtomicReference<Model> reconciledModelReference = new AtomicReference<Model>();
+        try
+        {
+          new ProgressMonitorDialog(activeEditorPart.getSite().getShell()).run(true, true, monitor ->
+            {
+              try
+              {
+                reconciledModelReference.set(reconciler.reconcile(monitor));
+              }
+              catch (Exception exception)
+              {
+                throw new RuntimeException(exception);
+              }
+            });
+
+          Model reconciledModel = reconciledModelReference.get();
+          if (reconciledModel != null && !EcoreUtil.equals(model, reconciledModel))
+          {
+            editingDomain.getCommandStack().execute(new ChangeCommand(Collections.singleton(model.eResource()))
+              {
+                {
+                  setLabel("Reconcile");
+                }
+
+                @Override
+                protected void doExecute()
+                {
+                  EcoreUtil.replace(model, reconciledModel);
+                }
+              });
+          }
+        }
+        catch (Exception exception)
+        {
+          ModelEditorPlugin.INSTANCE.log(exception);
+          Throwable throwable = exception;
+          if (exception instanceof InvocationTargetException)
+          {
+            throwable = ((InvocationTargetException)exception).getTargetException();
+          }
+
+          ErrorDialog.openError(
+            shell,
+            "Reconciliation Problems",
+            "Reconciliation failed",
+            new Status(IStatus.ERROR, ModelEditorPlugin.INSTANCE.getSymbolicName(), 1, throwable.getLocalizedMessage() + "\n\nSee the error log for more details", throwable));
+        }
+      }
+    }
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelEditor.java b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelEditor.java
new file mode 100644
index 0000000..e50103d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelEditor.java
@@ -0,0 +1,1814 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.presentation;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.command.AbstractCommand;
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.common.command.CommandStack;
+import org.eclipse.emf.common.command.CommandStackListener;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.ui.MarkerHelper;
+import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
+import org.eclipse.emf.common.ui.viewer.ColumnViewerInformationControlToolTipSupport;
+import org.eclipse.emf.common.ui.viewer.IViewerProvider;
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
+import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
+import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
+import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
+import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;
+import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
+import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
+import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.edit.ui.provider.DecoratingColumLabelProvider;
+import org.eclipse.emf.edit.ui.provider.DiagnosticDecorator;
+import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
+import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
+import org.eclipse.emf.edit.ui.util.EditUIUtil;
+import org.eclipse.emf.edit.ui.util.FindAndReplaceTarget;
+import org.eclipse.emf.edit.ui.util.IRevertablePart;
+import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.text.IFindReplaceTarget;
+import org.eclipse.jface.util.LocalSelectionTransfer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.justj.codegen.model.provider.ModelItemProviderAdapterFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.FileTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.SaveAsDialog;
+import org.eclipse.ui.ide.IGotoMarker;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+
+
+/**
+ * This is an example of a Model model editor.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelEditor extends MultiPageEditorPart implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker, IRevertablePart
+{
+  /**
+   * This keeps track of the editing domain that is used to track all changes to the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected AdapterFactoryEditingDomain editingDomain;
+
+  /**
+   * This is the one adapter factory used for providing views of the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ComposedAdapterFactory adapterFactory;
+
+  /**
+   * This is the content outline page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IContentOutlinePage contentOutlinePage;
+
+  /**
+   * This is a kludge...
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IStatusLineManager contentOutlineStatusLineManager;
+
+  /**
+   * This is the content outline page's viewer.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TreeViewer contentOutlineViewer;
+
+  /**
+   * This is the property sheet page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected List<PropertySheetPage> propertySheetPages = new ArrayList<PropertySheetPage>();
+
+  /**
+   * This is the viewer that shadows the selection in the content outline.
+   * The parent relation must be correctly defined for this to work.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TreeViewer selectionViewer;
+
+  /**
+   * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content outline viewer.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Viewer currentViewer;
+
+  /**
+   * This listens to which ever viewer is active.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ISelectionChangedListener selectionChangedListener;
+
+  /**
+   * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to this editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
+
+  /**
+   * This keeps track of the selection of the editor as a whole.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ISelection editorSelection = StructuredSelection.EMPTY;
+
+  /**
+   * The MarkerHelper is responsible for creating workspace resource markers presented
+   * in Eclipse's Problems View.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected MarkerHelper markerHelper = new EditUIMarkerHelper();
+
+  /**
+   * This listens for when the outline becomes active
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IPartListener partListener = new IPartListener()
+    {
+      @Override
+      public void partActivated(IWorkbenchPart p)
+      {
+        if (p instanceof ContentOutline)
+        {
+          if (((ContentOutline)p).getCurrentPage() == contentOutlinePage)
+          {
+            getActionBarContributor().setActiveEditor(ModelEditor.this);
+
+            setCurrentViewer(contentOutlineViewer);
+          }
+        }
+        else if (p instanceof PropertySheet)
+        {
+          if (propertySheetPages.contains(((PropertySheet)p).getCurrentPage()))
+          {
+            getActionBarContributor().setActiveEditor(ModelEditor.this);
+            handleActivate();
+          }
+        }
+        else if (p == ModelEditor.this)
+        {
+          handleActivate();
+        }
+      }
+
+      @Override
+      public void partBroughtToTop(IWorkbenchPart p)
+      {
+        // Ignore.
+      }
+
+      @Override
+      public void partClosed(IWorkbenchPart p)
+      {
+        // Ignore.
+      }
+
+      @Override
+      public void partDeactivated(IWorkbenchPart p)
+      {
+        // Ignore.
+      }
+
+      @Override
+      public void partOpened(IWorkbenchPart p)
+      {
+        // Ignore.
+      }
+    };
+
+  /**
+   * Resources that have been removed since last activation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Resource> removedResources = new ArrayList<Resource>();
+
+  /**
+   * Resources that have been changed since last activation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Resource> changedResources = new ArrayList<Resource>();
+
+  /**
+   * Resources that have been saved.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Collection<Resource> savedResources = new ArrayList<Resource>();
+
+  /**
+   * Map to store the diagnostic associated with a resource.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>();
+
+  /**
+   * Controls whether the problem indication should be updated.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean updateProblemIndication = true;
+
+  /**
+   * Adapter used to update the problem indication when resources are demanded loaded.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EContentAdapter problemIndicationAdapter = new EContentAdapter()
+    {
+      protected boolean dispatching;
+
+      @Override
+      public void notifyChanged(Notification notification)
+      {
+        if (notification.getNotifier() instanceof Resource)
+        {
+          switch (notification.getFeatureID(Resource.class))
+          {
+            case Resource.RESOURCE__IS_LOADED:
+            case Resource.RESOURCE__ERRORS:
+            case Resource.RESOURCE__WARNINGS:
+            {
+              Resource resource = (Resource)notification.getNotifier();
+              Diagnostic diagnostic = analyzeResourceProblems(resource, null);
+              if (diagnostic.getSeverity() != Diagnostic.OK)
+              {
+                resourceToDiagnosticMap.put(resource, diagnostic);
+              }
+              else
+              {
+                resourceToDiagnosticMap.remove(resource);
+              }
+              dispatchUpdateProblemIndication();
+              break;
+            }
+          }
+        }
+        else
+        {
+          super.notifyChanged(notification);
+        }
+      }
+
+      protected void dispatchUpdateProblemIndication()
+      {
+        if (updateProblemIndication && !dispatching)
+        {
+          dispatching = true;
+          getSite().getShell().getDisplay().asyncExec(new Runnable()
+            {
+              @Override
+              public void run()
+              {
+                dispatching = false;
+                updateProblemIndication();
+              }
+            });
+        }
+      }
+
+      @Override
+      protected void setTarget(Resource target)
+      {
+        basicSetTarget(target);
+      }
+
+      @Override
+      protected void unsetTarget(Resource target)
+      {
+        basicUnsetTarget(target);
+        resourceToDiagnosticMap.remove(target);
+        dispatchUpdateProblemIndication();
+      }
+    };
+
+  /**
+   * This listens for workspace changes.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener()
+    {
+      @Override
+      public void resourceChanged(IResourceChangeEvent event)
+      {
+        IResourceDelta delta = event.getDelta();
+        try
+        {
+          class ResourceDeltaVisitor implements IResourceDeltaVisitor
+          {
+            protected ResourceSet resourceSet = editingDomain.getResourceSet();
+
+            protected Collection<Resource> changedResources = new ArrayList<Resource>();
+
+            protected Collection<Resource> removedResources = new ArrayList<Resource>();
+
+            @Override
+            public boolean visit(final IResourceDelta delta)
+            {
+              if (delta.getResource().getType() == IResource.FILE)
+              {
+                if (delta.getKind() == IResourceDelta.REMOVED || delta.getKind() == IResourceDelta.CHANGED)
+                {
+                  final Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);
+                  if (resource != null)
+                  {
+                    if (delta.getKind() == IResourceDelta.REMOVED)
+                    {
+                      removedResources.add(resource);
+                    }
+                    else
+                    {
+                      if ((delta.getFlags() & IResourceDelta.MARKERS) != 0)
+                      {
+                        DiagnosticDecorator.DiagnosticAdapter.update(resource, markerHelper.getMarkerDiagnostics(resource, (IFile)delta.getResource(), false));
+                      }
+                      if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
+                      {
+                        if (!savedResources.remove(resource))
+                        {
+                          changedResources.add(resource);
+                        }
+                      }
+                    }
+                  }
+                }
+                return false;
+              }
+
+              return true;
+            }
+
+            public Collection<Resource> getChangedResources()
+            {
+              return changedResources;
+            }
+
+            public Collection<Resource> getRemovedResources()
+            {
+              return removedResources;
+            }
+          }
+
+          final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+          delta.accept(visitor);
+
+          if (!visitor.getRemovedResources().isEmpty())
+          {
+            getSite().getShell().getDisplay().asyncExec(new Runnable()
+              {
+                @Override
+                public void run()
+                {
+                  removedResources.addAll(visitor.getRemovedResources());
+                  if (!isDirty())
+                  {
+                    getSite().getPage().closeEditor(ModelEditor.this, false);
+                  }
+                }
+              });
+          }
+
+          if (!visitor.getChangedResources().isEmpty())
+          {
+            getSite().getShell().getDisplay().asyncExec(new Runnable()
+              {
+                @Override
+                public void run()
+                {
+                  changedResources.addAll(visitor.getChangedResources());
+                  if (getSite().getPage().getActiveEditor() == ModelEditor.this)
+                  {
+                    handleActivate();
+                  }
+                }
+              });
+          }
+        }
+        catch (CoreException exception)
+        {
+          ModelEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+    };
+
+  /**
+   * Handles activation of the editor or it's associated views.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void handleActivate()
+  {
+    // Recompute the read only state.
+    //
+    if (editingDomain.getResourceToReadOnlyMap() != null)
+    {
+      editingDomain.getResourceToReadOnlyMap().clear();
+
+      // Refresh any actions that may become enabled or disabled.
+      //
+      setSelection(getSelection());
+    }
+
+    if (!removedResources.isEmpty())
+    {
+      if (handleDirtyConflict())
+      {
+        getSite().getPage().closeEditor(ModelEditor.this, false);
+      }
+      else
+      {
+        removedResources.clear();
+        changedResources.clear();
+        savedResources.clear();
+      }
+    }
+    else if (!changedResources.isEmpty())
+    {
+      changedResources.removeAll(savedResources);
+      handleChangedResources();
+      changedResources.clear();
+      savedResources.clear();
+    }
+  }
+
+  /**
+   * Handles what to do with changed resources on activation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void handleChangedResources()
+  {
+    if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict()))
+    {
+      ResourceSet resourceSet = editingDomain.getResourceSet();
+      if (isDirty())
+      {
+        changedResources.addAll(resourceSet.getResources());
+      }
+      editingDomain.getCommandStack().flush();
+
+      updateProblemIndication = false;
+      for (Resource resource : changedResources)
+      {
+        if (resource.isLoaded())
+        {
+          resource.unload();
+          try
+          {
+            resource.load(resourceSet.getLoadOptions());
+          }
+          catch (IOException exception)
+          {
+            if (!resourceToDiagnosticMap.containsKey(resource))
+            {
+              resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+            }
+          }
+        }
+      }
+
+      if (AdapterFactoryEditingDomain.isStale(editorSelection))
+      {
+        setSelection(StructuredSelection.EMPTY);
+      }
+
+      updateProblemIndication = true;
+      updateProblemIndication();
+    }
+  }
+
+  /**
+   * Updates the problems indication with the information described in the specified diagnostic.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void updateProblemIndication()
+  {
+    if (updateProblemIndication)
+    {
+      BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.OK, "org.eclipse.justj.codegen.editor", 0, null, new Object []{ editingDomain.getResourceSet() });
+      for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values())
+      {
+        if (childDiagnostic.getSeverity() != Diagnostic.OK)
+        {
+          diagnostic.add(childDiagnostic);
+        }
+      }
+
+      int lastEditorPage = getPageCount() - 1;
+      if (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart)
+      {
+        ((ProblemEditorPart)getEditor(lastEditorPage)).setDiagnostic(diagnostic);
+        if (diagnostic.getSeverity() != Diagnostic.OK)
+        {
+          setActivePage(lastEditorPage);
+        }
+      }
+      else if (diagnostic.getSeverity() != Diagnostic.OK)
+      {
+        ProblemEditorPart problemEditorPart = new ProblemEditorPart();
+        problemEditorPart.setDiagnostic(diagnostic);
+        problemEditorPart.setMarkerHelper(markerHelper);
+        try
+        {
+          addPage(++lastEditorPage, problemEditorPart, getEditorInput());
+          setPageText(lastEditorPage, problemEditorPart.getPartName());
+          setActivePage(lastEditorPage);
+          showTabs();
+        }
+        catch (PartInitException exception)
+        {
+          ModelEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+
+      if (markerHelper.hasMarkers(editingDomain.getResourceSet()))
+      {
+        try
+        {
+          markerHelper.updateMarkers(diagnostic);
+        }
+        catch (CoreException exception)
+        {
+          ModelEditorPlugin.INSTANCE.log(exception);
+        }
+      }
+    }
+  }
+
+  /**
+   * Shows a dialog that asks if conflicting changes should be discarded.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean handleDirtyConflict()
+  {
+    return MessageDialog.openQuestion(getSite().getShell(), getString("_UI_FileConflict_label"), getString("_WARN_FileConflict"));
+  }
+
+  /**
+   * This creates a model editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelEditor()
+  {
+    super();
+    initializeEditingDomain();
+  }
+
+  /**
+   * This sets up the editing domain for the model editor.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void initializeEditingDomain()
+  {
+    // Create an adapter factory that yields item providers.
+    //
+    adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+
+    adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
+    adapterFactory.addAdapterFactory(new ModelItemProviderAdapterFactory());
+    adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
+
+    // Create the command stack that will notify this editor as commands are executed.
+    //
+    BasicCommandStack commandStack = new BasicCommandStack()
+      {
+        @Override
+        public void execute(Command command)
+        {
+          // Cancel live validation before executing a command that will trigger a new round of validation.
+          //
+          if (!(command instanceof AbstractCommand.NonDirtying))
+          {
+            DiagnosticDecorator.cancel(editingDomain);
+          }
+          super.execute(command);
+        }
+      };
+
+    // Add a listener to set the most recent command's affected objects to be the selection of the viewer with focus.
+    //
+    commandStack.addCommandStackListener(new CommandStackListener()
+      {
+        @Override
+        public void commandStackChanged(final EventObject event)
+        {
+          getContainer().getDisplay().asyncExec(new Runnable()
+            {
+              @Override
+              public void run()
+              {
+                firePropertyChange(IEditorPart.PROP_DIRTY);
+
+                // Try to select the affected objects.
+                //
+                Command mostRecentCommand = ((CommandStack)event.getSource()).getMostRecentCommand();
+                if (mostRecentCommand != null)
+                {
+                  setSelectionToViewer(mostRecentCommand.getAffectedObjects());
+                }
+                for (Iterator<PropertySheetPage> i = propertySheetPages.iterator(); i.hasNext();)
+                {
+                  PropertySheetPage propertySheetPage = i.next();
+                  if (propertySheetPage.getControl() == null || propertySheetPage.getControl().isDisposed())
+                  {
+                    i.remove();
+                  }
+                  else
+                  {
+                    propertySheetPage.refresh();
+                  }
+                }
+              }
+            });
+        }
+      });
+
+    // Create the editing domain with a special command stack.
+    //
+    editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>());
+  }
+
+  /**
+   * This is here for the listener to be able to call it.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void firePropertyChange(int action)
+  {
+    super.firePropertyChange(action);
+  }
+
+  /**
+   * This sets the selection into whichever viewer is active.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setSelectionToViewer(Collection<?> collection)
+  {
+    final Collection<?> theSelection = collection;
+    // Make sure it's okay.
+    //
+    if (theSelection != null && !theSelection.isEmpty())
+    {
+      Runnable runnable = new Runnable()
+        {
+          @Override
+          public void run()
+          {
+            // Try to select the items in the current content viewer of the editor.
+            //
+            if (currentViewer != null)
+            {
+              currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true);
+            }
+          }
+        };
+      getSite().getShell().getDisplay().asyncExec(runnable);
+    }
+  }
+
+  /**
+   * This returns the editing domain as required by the {@link IEditingDomainProvider} interface.
+   * This is important for implementing the static methods of {@link AdapterFactoryEditingDomain}
+   * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EditingDomain getEditingDomain()
+  {
+    return editingDomain;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider
+  {
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory)
+    {
+      super(adapterFactory);
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    public Object[] getElements(Object object)
+    {
+      Object parent = super.getParent(object);
+      return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    public Object[] getChildren(Object object)
+    {
+      Object parent = super.getParent(object);
+      return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    public boolean hasChildren(Object object)
+    {
+      Object parent = super.getParent(object);
+      return parent != null;
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    public Object getParent(Object object)
+    {
+      return null;
+    }
+  }
+
+  /**
+   * This makes sure that one content viewer, either for the current page or the outline view, if it has focus,
+   * is the current one.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setCurrentViewer(Viewer viewer)
+  {
+    // If it is changing...
+    //
+    if (currentViewer != viewer)
+    {
+      if (selectionChangedListener == null)
+      {
+        // Create the listener on demand.
+        //
+        selectionChangedListener = new ISelectionChangedListener()
+          {
+            // This just notifies those things that are affected by the section.
+            //
+            @Override
+            public void selectionChanged(SelectionChangedEvent selectionChangedEvent)
+            {
+              setSelection(selectionChangedEvent.getSelection());
+            }
+          };
+      }
+
+      // Stop listening to the old one.
+      //
+      if (currentViewer != null)
+      {
+        currentViewer.removeSelectionChangedListener(selectionChangedListener);
+      }
+
+      // Start listening to the new one.
+      //
+      if (viewer != null)
+      {
+        viewer.addSelectionChangedListener(selectionChangedListener);
+      }
+
+      // Remember it.
+      //
+      currentViewer = viewer;
+
+      // Set the editors selection based on the current viewer's selection.
+      //
+      setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection());
+    }
+  }
+
+  /**
+   * This returns the viewer as required by the {@link IViewerProvider} interface.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Viewer getViewer()
+  {
+    return currentViewer;
+  }
+
+  /**
+   * This creates a context menu for the viewer and adds a listener as well registering the menu for extension.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void createContextMenuFor(StructuredViewer viewer)
+  {
+    MenuManager contextMenu = new MenuManager("#PopUp");
+    contextMenu.add(new Separator("additions"));
+    contextMenu.setRemoveAllWhenShown(true);
+    contextMenu.addMenuListener(this);
+    Menu menu = contextMenu.createContextMenu(viewer.getControl());
+    viewer.getControl().setMenu(menu);
+    getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
+
+    int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
+    Transfer[] transfers = new Transfer []{ LocalTransfer.getInstance(), LocalSelectionTransfer.getTransfer(), FileTransfer.getInstance() };
+    viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
+    viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer));
+  }
+
+  /**
+   * This is the method called to load a resource into the editing domain's resource set based on the editor's input.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void createModel()
+  {
+    URI resourceURI = EditUIUtil.getURI(getEditorInput(), editingDomain.getResourceSet().getURIConverter());
+    Exception exception = null;
+    Resource resource = null;
+    try
+    {
+      // Load the resource through the editing domain.
+      //
+      resource = editingDomain.getResourceSet().getResource(resourceURI, true);
+    }
+    catch (Exception e)
+    {
+      exception = e;
+      resource = editingDomain.getResourceSet().getResource(resourceURI, false);
+    }
+
+    Diagnostic diagnostic = analyzeResourceProblems(resource, exception);
+    if (diagnostic.getSeverity() != Diagnostic.OK)
+    {
+      resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+    }
+    editingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter);
+  }
+
+  /**
+   * Returns a diagnostic describing the errors and warnings listed in the resource
+   * and the specified exception (if any).
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Diagnostic analyzeResourceProblems(Resource resource, Exception exception)
+  {
+    boolean hasErrors = !resource.getErrors().isEmpty();
+    if (hasErrors || !resource.getWarnings().isEmpty())
+    {
+      BasicDiagnostic basicDiagnostic = new BasicDiagnostic(
+        hasErrors ? Diagnostic.ERROR : Diagnostic.WARNING,
+        "org.eclipse.justj.codegen.editor",
+        0,
+        getString("_UI_CreateModelError_message", resource.getURI()),
+        new Object []{ exception == null ? (Object)resource : exception });
+      basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));
+      return basicDiagnostic;
+    }
+    else if (exception != null)
+    {
+      return new BasicDiagnostic(Diagnostic.ERROR, "org.eclipse.justj.codegen.editor", 0, getString("_UI_CreateModelError_message", resource.getURI()), new Object []{ exception });
+    }
+    else
+    {
+      return Diagnostic.OK_INSTANCE;
+    }
+  }
+
+  /**
+   * This is the method used by the framework to install your own controls.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public void createPages()
+  {
+    // Creates the model from the editor input
+    //
+    createModel();
+
+    // Only creates the other pages if there is something that can be edited
+    //
+    if (!getEditingDomain().getResourceSet().getResources().isEmpty())
+    {
+      // Create a page for the selection tree view.
+      //
+      Tree tree = new Tree(getContainer(), SWT.MULTI);
+      selectionViewer = new TreeViewer(tree);
+      setCurrentViewer(selectionViewer);
+
+      selectionViewer.setUseHashlookup(true);
+      selectionViewer.setAutoExpandLevel(3);
+      selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+      selectionViewer.setLabelProvider(
+        new DecoratingColumLabelProvider(
+          new AdapterFactoryLabelProvider(adapterFactory),
+          new DiagnosticDecorator(editingDomain, selectionViewer, ModelEditorPlugin.getPlugin().getDialogSettings())));
+      selectionViewer.setInput(editingDomain.getResourceSet().getResources().get(0));
+      selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+
+      new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory).grabHorizontal = true;
+      new ColumnViewerInformationControlToolTipSupport(selectionViewer, new DiagnosticDecorator.EditingDomainLocationListener(editingDomain, selectionViewer));
+
+      createContextMenuFor(selectionViewer);
+      int pageIndex = addPage(tree);
+      setPageText(pageIndex, getString("_UI_SelectionPage_label"));
+
+      getSite().getShell().getDisplay().asyncExec(new Runnable()
+        {
+          @Override
+          public void run()
+          {
+            if (!getContainer().isDisposed())
+            {
+              setActivePage(0);
+            }
+          }
+        });
+    }
+
+    // Ensures that this editor will only display the page's tab
+    // area if there are more than one page
+    //
+    getContainer().addControlListener(new ControlAdapter()
+      {
+        boolean guard = false;
+
+        @Override
+        public void controlResized(ControlEvent event)
+        {
+          if (!guard)
+          {
+            guard = true;
+            hideTabs();
+            guard = false;
+          }
+        }
+      });
+
+    getSite().getShell().getDisplay().asyncExec(new Runnable()
+      {
+        @Override
+        public void run()
+        {
+          updateProblemIndication();
+        }
+      });
+  }
+
+  /**
+   * If there is just one page in the multi-page editor part,
+   * this hides the single tab at the bottom.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void hideTabs()
+  {
+    if (getPageCount() <= 1)
+    {
+      setPageText(0, "");
+      if (getContainer() instanceof CTabFolder)
+      {
+        Point point = getContainer().getSize();
+        Rectangle clientArea = getContainer().getClientArea();
+        getContainer().setSize(point.x, 2 * point.y - clientArea.height - clientArea.y);
+      }
+    }
+  }
+
+  /**
+   * If there is more than one page in the multi-page editor part,
+   * this shows the tabs at the bottom.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void showTabs()
+  {
+    if (getPageCount() > 1)
+    {
+      setPageText(0, getString("_UI_SelectionPage_label"));
+      if (getContainer() instanceof CTabFolder)
+      {
+        Point point = getContainer().getSize();
+        Rectangle clientArea = getContainer().getClientArea();
+        getContainer().setSize(point.x, clientArea.height + clientArea.y);
+      }
+    }
+  }
+
+  /**
+   * This is used to track the active viewer.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected void pageChange(int pageIndex)
+  {
+    super.pageChange(pageIndex);
+
+    if (contentOutlinePage != null)
+    {
+      handleContentOutlineSelection(contentOutlinePage.getSelection());
+    }
+  }
+
+  /**
+   * This is how the framework determines which interfaces we implement.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public <T> T getAdapter(Class<T> key)
+  {
+    if (key.equals(IContentOutlinePage.class))
+    {
+      return showOutlineView() ? key.cast(getContentOutlinePage()) : null;
+    }
+    else if (key.equals(IPropertySheetPage.class))
+    {
+      return key.cast(getPropertySheetPage());
+    }
+    else if (key.equals(IGotoMarker.class))
+    {
+      return key.cast(this);
+    }
+    else if (key.equals(IFindReplaceTarget.class))
+    {
+      return FindAndReplaceTarget.getAdapter(key, this, ModelEditorPlugin.getPlugin());
+    }
+    else
+    {
+      return super.getAdapter(key);
+    }
+  }
+
+  /**
+   * This accesses a cached version of the content outliner.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IContentOutlinePage getContentOutlinePage()
+  {
+    if (contentOutlinePage == null)
+    {
+      // The content outline is just a tree.
+      //
+      class MyContentOutlinePage extends ContentOutlinePage
+      {
+        @Override
+        public void createControl(Composite parent)
+        {
+          super.createControl(parent);
+          contentOutlineViewer = getTreeViewer();
+          contentOutlineViewer.addSelectionChangedListener(this);
+
+          // Set up the tree viewer.
+          //
+          contentOutlineViewer.setUseHashlookup(true);
+          contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
+          contentOutlineViewer.setLabelProvider(
+            new DecoratingColumLabelProvider(
+              new AdapterFactoryLabelProvider(adapterFactory),
+              new DiagnosticDecorator(editingDomain, contentOutlineViewer, ModelEditorPlugin.getPlugin().getDialogSettings())));
+          contentOutlineViewer.setInput(editingDomain.getResourceSet());
+
+          new ColumnViewerInformationControlToolTipSupport(contentOutlineViewer, new DiagnosticDecorator.EditingDomainLocationListener(editingDomain, contentOutlineViewer));
+
+          // Make sure our popups work.
+          //
+          createContextMenuFor(contentOutlineViewer);
+
+          if (!editingDomain.getResourceSet().getResources().isEmpty())
+          {
+            // Select the root object in the view.
+            //
+            contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
+          }
+        }
+
+        @Override
+        public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager)
+        {
+          super.makeContributions(menuManager, toolBarManager, statusLineManager);
+          contentOutlineStatusLineManager = statusLineManager;
+        }
+
+        @Override
+        public void setActionBars(IActionBars actionBars)
+        {
+          super.setActionBars(actionBars);
+          getActionBarContributor().shareGlobalActions(this, actionBars);
+        }
+      }
+
+      contentOutlinePage = new MyContentOutlinePage();
+
+      // Listen to selection so that we can handle it is a special way.
+      //
+      contentOutlinePage.addSelectionChangedListener(new ISelectionChangedListener()
+        {
+          // This ensures that we handle selections correctly.
+          //
+          @Override
+          public void selectionChanged(SelectionChangedEvent event)
+          {
+            handleContentOutlineSelection(event.getSelection());
+          }
+        });
+    }
+
+    return contentOutlinePage;
+  }
+
+  /**
+   * This accesses a cached version of the property sheet.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IPropertySheetPage getPropertySheetPage()
+  {
+    PropertySheetPage propertySheetPage = new ExtendedPropertySheetPage(
+      editingDomain,
+      ExtendedPropertySheetPage.Decoration.LIVE,
+      ModelEditorPlugin.getPlugin().getDialogSettings(),
+      0,
+      true)
+      {
+        @Override
+        public void setSelectionToViewer(List<?> selection)
+        {
+          ModelEditor.this.setSelectionToViewer(selection);
+          ModelEditor.this.setFocus();
+        }
+
+        @Override
+        public void setActionBars(IActionBars actionBars)
+        {
+          super.setActionBars(actionBars);
+          getActionBarContributor().shareGlobalActions(this, actionBars);
+        }
+      };
+    propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));
+    propertySheetPages.add(propertySheetPage);
+
+    return propertySheetPage;
+  }
+
+  /**
+   * This deals with how we want selection in the outliner to affect the other views.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void handleContentOutlineSelection(ISelection selection)
+  {
+    if (selectionViewer != null && !selection.isEmpty() && selection instanceof IStructuredSelection)
+    {
+      Iterator<?> selectedElements = ((IStructuredSelection)selection).iterator();
+      if (selectedElements.hasNext())
+      {
+        // Get the first selected element.
+        //
+        Object selectedElement = selectedElements.next();
+
+        ArrayList<Object> selectionList = new ArrayList<Object>();
+        selectionList.add(selectedElement);
+        while (selectedElements.hasNext())
+        {
+          selectionList.add(selectedElements.next());
+        }
+
+        // Set the selection to the widget.
+        //
+        selectionViewer.setSelection(new StructuredSelection(selectionList));
+      }
+    }
+  }
+
+  /**
+   * This is for implementing {@link IEditorPart} and simply tests the command stack.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean isDirty()
+  {
+    return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded();
+  }
+
+  /**
+   * This is for implementing {@link IRevertablePart}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void doRevert()
+  {
+    DiagnosticDecorator.cancel(editingDomain);
+
+    ResourceSet resourceSet = editingDomain.getResourceSet();
+    List<Resource> resources = resourceSet.getResources();
+    List<Resource> unloadedResources = new ArrayList<Resource>();
+    updateProblemIndication = false;
+    for (int i = 0; i < resources.size(); ++i)
+    {
+      Resource resource = resources.get(i);
+      if (resource.isLoaded())
+      {
+        resource.unload();
+        unloadedResources.add(resource);
+      }
+    }
+
+    resourceToDiagnosticMap.clear();
+    for (Resource resource : unloadedResources)
+    {
+      try
+      {
+        resource.load(resourceSet.getLoadOptions());
+      }
+      catch (IOException exception)
+      {
+        if (!resourceToDiagnosticMap.containsKey(resource))
+        {
+          resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+        }
+      }
+    }
+
+    editingDomain.getCommandStack().flush();
+
+    if (AdapterFactoryEditingDomain.isStale(editorSelection))
+    {
+      setSelection(StructuredSelection.EMPTY);
+    }
+
+    updateProblemIndication = true;
+    updateProblemIndication();
+  }
+
+  /**
+   * This is for implementing {@link IEditorPart} and simply saves the model file.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void doSave(IProgressMonitor progressMonitor)
+  {
+    // Save only resources that have actually changed.
+    //
+    final Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+    saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
+    saveOptions.put(Resource.OPTION_LINE_DELIMITER, Resource.OPTION_LINE_DELIMITER_UNSPECIFIED);
+
+    // Do the work within an operation because this is a long running activity that modifies the workbench.
+    //
+    WorkspaceModifyOperation operation = new WorkspaceModifyOperation()
+      {
+        // This is the method that gets invoked when the operation runs.
+        //
+        @Override
+        public void execute(IProgressMonitor monitor)
+        {
+          // Save the resources to the file system.
+          //
+          boolean first = true;
+          List<Resource> resources = editingDomain.getResourceSet().getResources();
+          for (int i = 0; i < resources.size(); ++i)
+          {
+            Resource resource = resources.get(i);
+            if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource))
+            {
+              try
+              {
+                long timeStamp = resource.getTimeStamp();
+                resource.save(saveOptions);
+                if (resource.getTimeStamp() != timeStamp)
+                {
+                  savedResources.add(resource);
+                }
+              }
+              catch (Exception exception)
+              {
+                resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+              }
+              first = false;
+            }
+          }
+        }
+      };
+
+    updateProblemIndication = false;
+    try
+    {
+      // This runs the options, and shows progress.
+      //
+      new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation);
+
+      // Refresh the necessary state.
+      //
+      ((BasicCommandStack)editingDomain.getCommandStack()).saveIsDone();
+      firePropertyChange(IEditorPart.PROP_DIRTY);
+    }
+    catch (Exception exception)
+    {
+      // Something went wrong that shouldn't.
+      //
+      ModelEditorPlugin.INSTANCE.log(exception);
+    }
+    updateProblemIndication = true;
+    updateProblemIndication();
+  }
+
+  /**
+   * This returns whether something has been persisted to the URI of the specified resource.
+   * The implementation uses the URI converter from the editor's resource set to try to open an input stream.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean isPersisted(Resource resource)
+  {
+    boolean result = false;
+    try
+    {
+      InputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI());
+      if (stream != null)
+      {
+        result = true;
+        stream.close();
+      }
+    }
+    catch (IOException e)
+    {
+      // Ignore
+    }
+    return result;
+  }
+
+  /**
+   * This always returns true because it is not currently supported.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean isSaveAsAllowed()
+  {
+    return true;
+  }
+
+  /**
+   * This also changes the editor's input.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void doSaveAs()
+  {
+    SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
+    saveAsDialog.open();
+    IPath path = saveAsDialog.getResult();
+    if (path != null)
+    {
+      IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+      if (file != null)
+      {
+        doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file));
+      }
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void doSaveAs(URI uri, IEditorInput editorInput)
+  {
+    (editingDomain.getResourceSet().getResources().get(0)).setURI(uri);
+    setInputWithNotify(editorInput);
+    setPartName(editorInput.getName());
+    IProgressMonitor progressMonitor = getActionBars().getStatusLineManager() != null ? getActionBars().getStatusLineManager().getProgressMonitor() : new NullProgressMonitor();
+    doSave(progressMonitor);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void gotoMarker(IMarker marker)
+  {
+    List<?> targetObjects = markerHelper.getTargetObjects(editingDomain, marker);
+    if (!targetObjects.isEmpty())
+    {
+      setSelectionToViewer(targetObjects);
+    }
+  }
+
+  /**
+   * This is called during startup.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void init(IEditorSite site, IEditorInput editorInput)
+  {
+    setSite(site);
+    setInputWithNotify(editorInput);
+    setPartName(editorInput.getName());
+    site.setSelectionProvider(this);
+    site.getPage().addPartListener(partListener);
+    ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setFocus()
+  {
+    getControl(getActivePage()).setFocus();
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void addSelectionChangedListener(ISelectionChangedListener listener)
+  {
+    selectionChangedListeners.add(listener);
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void removeSelectionChangedListener(ISelectionChangedListener listener)
+  {
+    selectionChangedListeners.remove(listener);
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to return this editor's overall selection.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ISelection getSelection()
+  {
+    return editorSelection;
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to set this editor's overall selection.
+   * Calling this result will notify the listeners.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setSelection(ISelection selection)
+  {
+    editorSelection = selection;
+
+    for (ISelectionChangedListener listener : selectionChangedListeners)
+    {
+      listener.selectionChanged(new SelectionChangedEvent(this, selection));
+    }
+    setStatusLineManager(selection);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setStatusLineManager(ISelection selection)
+  {
+    IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer
+      ? contentOutlineStatusLineManager : getActionBars().getStatusLineManager();
+
+    if (statusLineManager != null)
+    {
+      if (selection instanceof IStructuredSelection)
+      {
+        Collection<?> collection = ((IStructuredSelection)selection).toList();
+        switch (collection.size())
+        {
+          case 0:
+          {
+            statusLineManager.setMessage(getString("_UI_NoObjectSelected"));
+            break;
+          }
+          case 1:
+          {
+            String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());
+            statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text));
+            break;
+          }
+          default:
+          {
+            statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size())));
+            break;
+          }
+        }
+      }
+      else
+      {
+        statusLineManager.setMessage("");
+      }
+    }
+  }
+
+  /**
+   * This looks up a string in the plugin's plugin.properties file.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static String getString(String key)
+  {
+    return ModelEditorPlugin.INSTANCE.getString(key);
+  }
+
+  /**
+   * This looks up a string in plugin.properties, making a substitution.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static String getString(String key, Object s1)
+  {
+    return ModelEditorPlugin.INSTANCE.getString(key, new Object []{ s1 });
+  }
+
+  /**
+   * This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions from the Edit menu.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void menuAboutToShow(IMenuManager menuManager)
+  {
+    ((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EditingDomainActionBarContributor getActionBarContributor()
+  {
+    return (EditingDomainActionBarContributor)getEditorSite().getActionBarContributor();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IActionBars getActionBars()
+  {
+    return getActionBarContributor().getActionBars();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public AdapterFactory getAdapterFactory()
+  {
+    return adapterFactory;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void dispose()
+  {
+    updateProblemIndication = false;
+
+    ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
+
+    getSite().getPage().removePartListener(partListener);
+
+    adapterFactory.dispose();
+
+    if (getActionBarContributor().getActiveEditor() == this)
+    {
+      getActionBarContributor().setActiveEditor(null);
+    }
+
+    for (PropertySheetPage propertySheetPage : propertySheetPages)
+    {
+      propertySheetPage.dispose();
+    }
+
+    if (contentOutlinePage != null)
+    {
+      contentOutlinePage.dispose();
+    }
+
+    super.dispose();
+  }
+
+  /**
+   * Returns whether the outline view should be presented to the user.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected boolean showOutlineView()
+  {
+    return false;
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelEditorPlugin.java b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelEditorPlugin.java
new file mode 100644
index 0000000..0d367a3
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelEditorPlugin.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.presentation;
+
+
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.ui.EclipseUIPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+
+
+/**
+ * This is the central singleton for the Model editor plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ModelEditorPlugin extends EMFPlugin
+{
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final ModelEditorPlugin INSTANCE = new ModelEditorPlugin();
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static Implementation plugin;
+
+  /**
+   * Create the instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelEditorPlugin()
+  {
+    super(new ResourceLocator []{});
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  @Override
+  public ResourceLocator getPluginResourceLocator()
+  {
+    return plugin;
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  public static Implementation getPlugin()
+  {
+    return plugin;
+  }
+
+  /**
+   * The actual implementation of the Eclipse <b>Plugin</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static class Implementation extends EclipseUIPlugin
+  {
+    /**
+    	 * Creates an instance.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public Implementation()
+    {
+      super();
+
+      // Remember the static instance.
+      //
+      plugin = this;
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelModelWizard.java b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelModelWizard.java
new file mode 100644
index 0000000..84921a5
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen.editor/src/org/eclipse/justj/codegen/model/presentation/ModelModelWizard.java
@@ -0,0 +1,659 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.presentation;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.CommonPlugin;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.provider.ModelEditPlugin;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.ISetSelectionTarget;
+
+
+/**
+ * This is a simple wizard for creating a new model file.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelModelWizard extends Wizard implements INewWizard
+{
+  /**
+   * The supported extensions for created files.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final List<String> FILE_EXTENSIONS = Collections.unmodifiableList(
+    Arrays.asList(ModelEditorPlugin.INSTANCE.getString("_UI_ModelEditorFilenameExtensions").split("\\s*,\\s*")));
+
+  /**
+   * A formatted list of supported file extensions, suitable for display.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final String FORMATTED_FILE_EXTENSIONS = ModelEditorPlugin.INSTANCE.getString("_UI_ModelEditorFilenameExtensions").replaceAll("\\s*,\\s*", ", ");
+
+  /**
+   * This caches an instance of the model package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelPackage modelPackage = ModelPackage.eINSTANCE;
+
+  /**
+   * This caches an instance of the model factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelFactory modelFactory = modelPackage.getModelFactory();
+
+  /**
+   * This is the file creation page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelModelWizardNewFileCreationPage newFileCreationPage;
+
+  /**
+   * This is the initial object creation page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelModelWizardInitialObjectCreationPage initialObjectCreationPage;
+
+  /**
+   * Remember the selection during initialization for populating the default container.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IStructuredSelection selection;
+
+  /**
+   * Remember the workbench during initialization.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected IWorkbench workbench;
+
+  /**
+   * Caches the names of the types that can be created as the root object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected List<String> initialObjectNames;
+
+  /**
+   * This just records the information.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void init(IWorkbench workbench, IStructuredSelection selection)
+  {
+    this.workbench = workbench;
+    this.selection = selection;
+    setWindowTitle(ModelEditorPlugin.INSTANCE.getString("_UI_Wizard_label"));
+    setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(ModelEditorPlugin.INSTANCE.getImage("full/wizban/NewModel")));
+  }
+
+  /**
+   * Returns the names of the types that can be created as the root object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  protected Collection<String> getInitialObjectNames()
+  {
+    if (initialObjectNames == null)
+    {
+      initialObjectNames = new ArrayList<String>();
+      initialObjectNames.add("Model");
+      Collections.sort(initialObjectNames, CommonPlugin.INSTANCE.getComparator());
+    }
+    return initialObjectNames;
+  }
+
+  /**
+   * Create a new model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected EObject createInitialModel()
+  {
+    EClass eClass = (EClass)modelPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName());
+    EObject rootObject = modelFactory.create(eClass);
+    return rootObject;
+  }
+
+  /**
+   * Do the work after everything is specified.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean performFinish()
+  {
+    try
+    {
+      // Remember the file.
+      //
+      final IFile modelFile = getModelFile();
+
+      // Do the work within an operation.
+      //
+      WorkspaceModifyOperation operation = new WorkspaceModifyOperation()
+        {
+          @Override
+          protected void execute(IProgressMonitor progressMonitor)
+          {
+            try
+            {
+              // Create a resource set
+              //
+              ResourceSet resourceSet = new ResourceSetImpl();
+
+              // Get the URI of the model file.
+              //
+              URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);
+
+              // Create a resource for this file.
+              //
+              Resource resource = resourceSet.createResource(fileURI, ModelPackage.eCONTENT_TYPE);
+
+              // Add the initial model object to the contents.
+              //
+              EObject rootObject = createInitialModel();
+              if (rootObject != null)
+              {
+                resource.getContents().add(rootObject);
+              }
+
+              // Save the contents of the resource to the file system.
+              //
+              Map<Object, Object> options = new HashMap<Object, Object>();
+              options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());
+              resource.save(options);
+            }
+            catch (Exception exception)
+            {
+              ModelEditorPlugin.INSTANCE.log(exception);
+            }
+            finally
+            {
+              progressMonitor.done();
+            }
+          }
+        };
+
+      getContainer().run(false, false, operation);
+
+      // Select the new file resource in the current view.
+      //
+      IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+      IWorkbenchPage page = workbenchWindow.getActivePage();
+      final IWorkbenchPart activePart = page.getActivePart();
+      if (activePart instanceof ISetSelectionTarget)
+      {
+        final ISelection targetSelection = new StructuredSelection(modelFile);
+        getShell().getDisplay().asyncExec(new Runnable()
+          {
+            @Override
+            public void run()
+            {
+              ((ISetSelectionTarget)activePart).selectReveal(targetSelection);
+            }
+          });
+      }
+
+      // Open an editor on the new file.
+      //
+      try
+      {
+        page.openEditor(
+          new FileEditorInput(modelFile),
+          workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString(), Platform.getContentTypeManager().getContentType(ModelPackage.eCONTENT_TYPE)).getId());
+      }
+      catch (PartInitException exception)
+      {
+        MessageDialog.openError(workbenchWindow.getShell(), ModelEditorPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage());
+        return false;
+      }
+
+      return true;
+    }
+    catch (Exception exception)
+    {
+      ModelEditorPlugin.INSTANCE.log(exception);
+      return false;
+    }
+  }
+
+  /**
+   * This is the one page of the wizard.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public class ModelModelWizardNewFileCreationPage extends WizardNewFileCreationPage
+  {
+    /**
+    	 * Pass in the selection.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public ModelModelWizardNewFileCreationPage(String pageId, IStructuredSelection selection)
+    {
+      super(pageId, selection);
+    }
+
+    /**
+    	 * The framework calls this to see if the file is correct.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    protected boolean validatePage()
+    {
+      if (super.validatePage())
+      {
+        String extension = new Path(getFileName()).getFileExtension();
+        if (extension == null || !FILE_EXTENSIONS.contains(extension))
+        {
+          String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";
+          setErrorMessage(ModelEditorPlugin.INSTANCE.getString(key, new Object []{ FORMATTED_FILE_EXTENSIONS }));
+          return false;
+        }
+        return true;
+      }
+      return false;
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public IFile getModelFile()
+    {
+      return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));
+    }
+  }
+
+  /**
+   * This is the page where the type of object to create is selected.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public class ModelModelWizardInitialObjectCreationPage extends WizardPage
+  {
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    protected Combo initialObjectField;
+
+    /**
+    	 * @generated
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 */
+    protected List<String> encodings;
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    protected Combo encodingField;
+
+    /**
+    	 * Pass in the selection.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public ModelModelWizardInitialObjectCreationPage(String pageId)
+    {
+      super(pageId);
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    public void createControl(Composite parent)
+    {
+      Composite composite = new Composite(parent, SWT.NONE);
+      {
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 1;
+        layout.verticalSpacing = 12;
+        composite.setLayout(layout);
+
+        GridData data = new GridData();
+        data.verticalAlignment = GridData.FILL;
+        data.grabExcessVerticalSpace = true;
+        data.horizontalAlignment = GridData.FILL;
+        composite.setLayoutData(data);
+      }
+
+      Label containerLabel = new Label(composite, SWT.LEFT);
+      {
+        containerLabel.setText(ModelEditorPlugin.INSTANCE.getString("_UI_ModelObject"));
+
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        containerLabel.setLayoutData(data);
+      }
+
+      initialObjectField = new Combo(composite, SWT.BORDER);
+      {
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        data.grabExcessHorizontalSpace = true;
+        initialObjectField.setLayoutData(data);
+      }
+
+      for (String objectName : getInitialObjectNames())
+      {
+        initialObjectField.add(getLabel(objectName));
+      }
+
+      if (initialObjectField.getItemCount() == 1)
+      {
+        initialObjectField.select(0);
+      }
+      initialObjectField.addModifyListener(validator);
+
+      Label encodingLabel = new Label(composite, SWT.LEFT);
+      {
+        encodingLabel.setText(ModelEditorPlugin.INSTANCE.getString("_UI_XMLEncoding"));
+
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        encodingLabel.setLayoutData(data);
+      }
+      encodingField = new Combo(composite, SWT.BORDER);
+      {
+        GridData data = new GridData();
+        data.horizontalAlignment = GridData.FILL;
+        data.grabExcessHorizontalSpace = true;
+        encodingField.setLayoutData(data);
+      }
+
+      for (String encoding : getEncodings())
+      {
+        encodingField.add(encoding);
+      }
+
+      encodingField.select(0);
+      encodingField.addModifyListener(validator);
+
+      setPageComplete(validatePage());
+      setControl(composite);
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    protected ModifyListener validator = new ModifyListener()
+      {
+        @Override
+        public void modifyText(ModifyEvent e)
+        {
+          setPageComplete(validatePage());
+        }
+      };
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    protected boolean validatePage()
+    {
+      return getInitialObjectName() != null && getEncodings().contains(encodingField.getText());
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    @Override
+    public void setVisible(boolean visible)
+    {
+      super.setVisible(visible);
+      if (visible)
+      {
+        if (initialObjectField.getItemCount() == 1)
+        {
+          initialObjectField.clearSelection();
+          encodingField.setFocus();
+        }
+        else
+        {
+          encodingField.clearSelection();
+          initialObjectField.setFocus();
+        }
+      }
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public String getInitialObjectName()
+    {
+      String label = initialObjectField.getText();
+
+      for (String name : getInitialObjectNames())
+      {
+        if (getLabel(name).equals(label))
+        {
+          return name;
+        }
+      }
+      return null;
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public String getEncoding()
+    {
+      return encodingField.getText();
+    }
+
+    /**
+    	 * Returns the label for the specified type name.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    protected String getLabel(String typeName)
+    {
+      try
+      {
+        return ModelEditPlugin.INSTANCE.getString("_UI_" + typeName + "_type");
+      }
+      catch (MissingResourceException mre)
+      {
+        ModelEditorPlugin.INSTANCE.log(mre);
+      }
+      return typeName;
+    }
+
+    /**
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    protected Collection<String> getEncodings()
+    {
+      if (encodings == null)
+      {
+        encodings = new ArrayList<String>();
+        for (StringTokenizer stringTokenizer = new StringTokenizer(ModelEditorPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens();)
+        {
+          encodings.add(stringTokenizer.nextToken());
+        }
+      }
+      return encodings;
+    }
+  }
+
+  /**
+   * The framework calls this to create the contents of the wizard.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void addPages()
+  {
+    // Create a page, set the title, and the initial model file name.
+    //
+    newFileCreationPage = new ModelModelWizardNewFileCreationPage("Whatever", selection);
+    newFileCreationPage.setTitle(ModelEditorPlugin.INSTANCE.getString("_UI_ModelModelWizard_label"));
+    newFileCreationPage.setDescription(ModelEditorPlugin.INSTANCE.getString("_UI_ModelModelWizard_description"));
+    newFileCreationPage.setFileName(ModelEditorPlugin.INSTANCE.getString("_UI_ModelEditorFilenameDefaultBase") + "." + FILE_EXTENSIONS.get(0));
+    addPage(newFileCreationPage);
+
+    // Try and get the resource selection to determine a current directory for the file dialog.
+    //
+    if (selection != null && !selection.isEmpty())
+    {
+      // Get the resource...
+      //
+      Object selectedElement = selection.iterator().next();
+      if (selectedElement instanceof IResource)
+      {
+        // Get the resource parent, if its a file.
+        //
+        IResource selectedResource = (IResource)selectedElement;
+        if (selectedResource.getType() == IResource.FILE)
+        {
+          selectedResource = selectedResource.getParent();
+        }
+
+        // This gives us a directory...
+        //
+        if (selectedResource instanceof IFolder || selectedResource instanceof IProject)
+        {
+          // Set this for the container.
+          //
+          newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());
+
+          // Make up a unique new name here.
+          //
+          String defaultModelBaseFilename = ModelEditorPlugin.INSTANCE.getString("_UI_ModelEditorFilenameDefaultBase");
+          String defaultModelFilenameExtension = FILE_EXTENSIONS.get(0);
+          String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;
+          for (int i = 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i)
+          {
+            modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension;
+          }
+          newFileCreationPage.setFileName(modelFilename);
+        }
+      }
+    }
+    initialObjectCreationPage = new ModelModelWizardInitialObjectCreationPage("Whatever2");
+    initialObjectCreationPage.setTitle(ModelEditorPlugin.INSTANCE.getString("_UI_ModelModelWizard_label"));
+    initialObjectCreationPage.setDescription(ModelEditorPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description"));
+    addPage(initialObjectCreationPage);
+  }
+
+  /**
+   * Get the file from the page.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public IFile getModelFile()
+  {
+    return newFileCreationPage.getModelFile();
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen/.classpath b/plugins/org.eclipse.justj.codegen/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.justj.codegen/.jetproperties b/plugins/org.eclipse.justj.codegen/.jetproperties
new file mode 100644
index 0000000..5585019
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/.jetproperties
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jet-settings>
+	<template-container>templates</template-container>	<source-container>src</source-container>
+</jet-settings>
diff --git a/plugins/org.eclipse.justj.codegen/.project b/plugins/org.eclipse.justj.codegen/.project
new file mode 100644
index 0000000..ebf5123
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/.project
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.codegen</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.emf.codegen.JETBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.emf.codegen.jet.IJETNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1587539265552</id>
+			<name></name>
+			<type>26</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-name-matches-false-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.justj.codegen/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9f6ece8
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/plugins/org.eclipse.justj.codegen/META-INF/MANIFEST.MF b/plugins/org.eclipse.justj.codegen/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f8964f0
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.justj.codegen;singleton:=true
+Automatic-Module-Name: org.eclipse.justj.codegen
+Bundle-Version: 0.1.0.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: org.eclipse.justj.codegen.model.ModelPlugin$Implementation
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.justj.codegen.model,
+ org.eclipse.justj.codegen.model.impl,
+ org.eclipse.justj.codegen.model.util,
+ org.eclipse.justj.codegen.templates,
+ org.eclipse.justj.codegen.templates.feature,
+ org.eclipse.justj.codegen.templates.fragment,
+ org.eclipse.justj.codegen.templates.plugin,
+ org.eclipse.justj.codegen.templates.releng.parent,
+ org.eclipse.justj.codegen.templates.releng.parent.features,
+ org.eclipse.justj.codegen.templates.releng.parent.plugins,
+ org.eclipse.justj.codegen.templates.releng.site
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.emf.ecore.xmi;visibility:=reexport,
+ org.apache.commons.compress
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.justj.codegen/about.html b/plugins/org.eclipse.justj.codegen/about.html
new file mode 100644
index 0000000..164f781
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/about.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>About</title>
+</head>
+<body lang="EN-US">
+	<h2>About This Content</h2>
+
+	<p>November 30, 2017</p>
+	<h3>License</h3>
+
+	<p>
+		The Eclipse Foundation makes available all content in this plug-in
+		(&quot;Content&quot;). Unless otherwise indicated below, the Content
+		is provided to you under the terms and conditions of the Eclipse
+		Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+		available at <a href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+		For purposes of the EPL, &quot;Program&quot; will mean the Content.
+	</p>
+
+	<p>
+		If you did not receive this Content directly from the Eclipse
+		Foundation, the Content is being redistributed by another party
+		(&quot;Redistributor&quot;) and different terms and conditions may
+		apply to your use of any object code in the Content. Check the
+		Redistributor's license that was provided with the Content. If no such
+		license exists, contact the Redistributor. Unless otherwise indicated
+		below, the terms and conditions of the EPL still apply to any source
+		code in the Content and such source code may be obtained at <a
+			href="http://www.eclipse.org/">http://www.eclipse.org</a>.
+	</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.codegen/about.mappings b/plugins/org.eclipse.justj.codegen/about.mappings
new file mode 100644
index 0000000..9c84f0a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/about.mappings
@@ -0,0 +1,2 @@
+0=${build.id}
+1=${git.commit}
diff --git a/plugins/org.eclipse.justj.codegen/build.properties b/plugins/org.eclipse.justj.codegen/build.properties
new file mode 100644
index 0000000..f4a9a7d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/build.properties
@@ -0,0 +1,22 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+
+bin.includes = .,\
+               model/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               templates/,\
+               about.mappings,\
+               about.html
+jars.compile.order = .
+source.. = src/
+output.. = bin/
+src.includes = about.html,\
+               about.mappings
diff --git a/plugins/org.eclipse.justj.codegen/model/Model.ecore b/plugins/org.eclipse.justj.codegen/model/Model.ecore
new file mode 100644
index 0000000..c458d03
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/model/Model.ecore
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model" nsURI="http://www.eclipse.org/just/2020/Model" nsPrefix="model">
+  <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+    <details key="copyrightText" value="Copyright (c) 2020 Eclipse contributors and others.&#xA;&#xA;This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;https://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0"/>
+  </eAnnotations>
+  <eClassifiers xsi:type="ecore:EClass" name="Model" eSuperTypes="#//Copyrightable #//Touchable">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="label" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="provider" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="providerImageName" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="providerImageData" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Base64Binary"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aboutURL" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
+        defaultValueLiteral="https://www.eclipse.org/legal/epl/epl-2.0/about.html"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="target" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="source" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="localCache" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="jVMs" lowerBound="1" upperBound="-1"
+        eType="#//JVM" containment="true" resolveProxies="false" eOpposite="#//JVM/model">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="name" value="jvm"/>
+        <details key="kind" value="element"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="JVM" eSuperTypes="#//Copyrightable #//Touchable">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <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="label" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="model" eType="#//Model"
+        transient="true" resolveProxies="false" eOpposite="#//Model/jVMs"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="aboutTextExtra" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="propertyMultiLine" value="true"/>
+      </eAnnotations>
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="variants" lowerBound="1"
+        upperBound="-1" eType="#//Variant" containment="true" resolveProxies="false"
+        eOpposite="#//Variant/jVM">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="name" value="variant"/>
+        <details key="kind" value="element"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Variant" eSuperTypes="#//Copyrightable #//Touchable">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="os" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="arch" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="label" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="source" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="jVM" eType="#//JVM" transient="true"
+        resolveProxies="false" eOpposite="#//JVM/variants">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="name" value="jvm"/>
+        <details key="kind" value="element"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Copyrightable" abstract="true">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copyrightHolder" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copyrightYear" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="copyrightText" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+        <details key="propertyMultiLine" value="true"/>
+      </eAnnotations>
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Touchpoint">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="phase" eType="#//Phase"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="instructions" unique="false"
+        lowerBound="1" upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString">
+      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
+        <details key="kind" value="element"/>
+        <details key="name" value="instruction"/>
+      </eAnnotations>
+    </eStructuralFeatures>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="Phase">
+    <eLiterals name="Install" literal="install"/>
+    <eLiterals name="Uninstall" value="1" literal="uninstall"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Touchable" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="touchpoints" upperBound="-1"
+        eType="#//Touchpoint" containment="true"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/plugins/org.eclipse.justj.codegen/model/Model.genmodel b/plugins/org.eclipse.justj.codegen/model/Model.genmodel
new file mode 100644
index 0000000..6e5ddca
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/model/Model.genmodel
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2020 Eclipse contributors and others.&#xA;&#xA;This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License 2.0&#xA;which accompanies this distribution, and is available at&#xA;https://www.eclipse.org/legal/epl-2.0/&#xA;&#xA;SPDX-License-Identifier: EPL-2.0"
+    modelDirectory="/org.eclipse.justj.codegen/src" creationIcons="false" modelPluginID="org.eclipse.justj.codegen"
+    modelName="Model" modelPluginClass="org.eclipse.justj.codegen.model.ModelPlugin"
+    rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container" codeFormatting="true"
+    testsDirectory="" importerID="org.eclipse.emf.importer.ecore" complianceLevel="8.0"
+    suppressGenModelAnnotations="false" copyrightFields="false" operationReflection="true"
+    decoration="Live" cleanup="true" autoResizeProperties="true" findAction="true"
+    expandAllAction="true" collapseAllAction="true" revertAction="true">
+  <foreignModel>Model.ecore</foreignModel>
+  <genPackages prefix="Model" basePackage="org.eclipse.justj.codegen" resource="XML"
+      disposableProviderFactory="true" multipleEditorPages="false" contentTypeIdentifier="org.eclipse.justj.codegen"
+      fileExtensions="jregen" ecorePackage="Model.ecore#/">
+    <genEnums typeSafeEnumCompatible="false" ecoreEnum="Model.ecore#//Phase">
+      <genEnumLiterals ecoreEnumLiteral="Model.ecore#//Phase/Install"/>
+      <genEnumLiterals ecoreEnumLiteral="Model.ecore#//Phase/Uninstall"/>
+    </genEnums>
+    <genClasses ecoreClass="Model.ecore#//Model">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/label"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/provider"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/providerImageName"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/providerImageData"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/aboutURL"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/target"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/source"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Model/localCache"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Model.ecore#//Model/jVMs"/>
+    </genClasses>
+    <genClasses ecoreClass="Model.ecore#//JVM">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//JVM/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//JVM/version"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//JVM/label"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference Model.ecore#//JVM/model"/>
+      <genFeatures createChild="false" propertyMultiLine="true" ecoreFeature="ecore:EAttribute Model.ecore#//JVM/aboutTextExtra"/>
+      <genFeatures children="true" createChild="true" propertySortChoices="true" ecoreFeature="ecore:EReference Model.ecore#//JVM/variants"/>
+    </genClasses>
+    <genClasses ecoreClass="Model.ecore#//Variant">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Variant/os"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Variant/arch"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Variant/label"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Variant/source"/>
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference Model.ecore#//Variant/jVM"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="Model.ecore#//Copyrightable">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Copyrightable/copyrightHolder"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Copyrightable/copyrightYear"/>
+      <genFeatures createChild="false" propertyMultiLine="true" ecoreFeature="ecore:EAttribute Model.ecore#//Copyrightable/copyrightText"/>
+    </genClasses>
+    <genClasses ecoreClass="Model.ecore#//Touchpoint">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Model.ecore#//Touchpoint/phase"/>
+      <genFeatures children="true" createChild="true" ecoreFeature="ecore:EAttribute Model.ecore#//Touchpoint/instructions"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="Model.ecore#//Touchable">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Model.ecore#//Touchable/touchpoints"/>
+    </genClasses>
+  </genPackages>
+  <codeStyle>UnnecessaryDeprecatedMethod</codeStyle>
+</genmodel:GenModel>
diff --git a/plugins/org.eclipse.justj.codegen/plugin.properties b/plugins/org.eclipse.justj.codegen/plugin.properties
new file mode 100644
index 0000000..7377e88
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/plugin.properties
@@ -0,0 +1,13 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+
+pluginName = JustJ Codegen Model
+providerName = Eclipse JustJ
+
+_UI_Model_content_type = Model File
diff --git a/plugins/org.eclipse.justj.codegen/plugin.xml b/plugins/org.eclipse.justj.codegen/plugin.xml
new file mode 100644
index 0000000..7b9cce2
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/plugin.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ Copyright (c) 2020 Eclipse contributors and others.
+ 
+ This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License 2.0
+ which accompanies this distribution, and is available at
+ https://www.eclipse.org/legal/epl-2.0/
+ 
+ SPDX-License-Identifier: EPL-2.0
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated Model -->
+      <package
+            uri="http://www.eclipse.org/just/2020/Model"
+            class="org.eclipse.justj.codegen.model.ModelPackage"
+            genModel="model/Model.genmodel"/>
+   </extension>
+
+   <extension point="org.eclipse.emf.ecore.content_parser">
+      <!-- @generated Model -->
+      <parser
+            contentTypeIdentifier="org.eclipse.justj.codegen"
+            class="org.eclipse.justj.codegen.model.util.ModelResourceFactoryImpl"/>
+   </extension>
+
+   <extension point="org.eclipse.core.contenttype.contentTypes">
+      <!-- @generated Model -->
+      <content-type
+            base-type="org.eclipse.core.runtime.xml"
+            file-extensions="jregen"
+            id="org.eclipse.justj.codegen"
+            name="%_UI_Model_content_type"
+            priority="normal">
+         <describer class="org.eclipse.emf.ecore.xmi.impl.RootXMLContentHandlerImpl$Describer">
+            <parameter name="namespace" value="http://www.eclipse.org/just/2020/Model"/>
+         </describer>
+      </content-type>
+   </extension>
+
+   <extension
+         id="generator"
+         point="org.eclipse.core.runtime.applications">
+      <application
+            cardinality="singleton-global"
+            thread="main"
+            visible="true">
+         <run
+               class="org.eclipse.justj.codegen.model.util.Generator$Application">
+         </run>
+      </application>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.justj.codegen/pom.xml b/plugins/org.eclipse.justj.codegen/pom.xml
new file mode 100644
index 0000000..224e597
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.plugins</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.justj.tools.parent/plugins</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.codegen</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>about.mappings</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Copyrightable.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Copyrightable.java
new file mode 100644
index 0000000..1781b88
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Copyrightable.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.ecore.EObject;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Copyrightable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightHolder <em>Copyright Holder</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightYear <em>Copyright Year</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightText <em>Copyright Text</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getCopyrightable()
+ * @model abstract="true"
+ * @generated
+ */
+public interface Copyrightable extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Copyright Holder</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Copyright Holder</em>' attribute.
+   * @see #setCopyrightHolder(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getCopyrightable_CopyrightHolder()
+   * @model
+   * @generated
+   */
+  String getCopyrightHolder();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightHolder <em>Copyright Holder</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Copyright Holder</em>' attribute.
+   * @see #getCopyrightHolder()
+   * @generated
+   */
+  void setCopyrightHolder(String value);
+
+  /**
+   * Returns the value of the '<em><b>Copyright Year</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Copyright Year</em>' attribute.
+   * @see #setCopyrightYear(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getCopyrightable_CopyrightYear()
+   * @model
+   * @generated
+   */
+  String getCopyrightYear();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightYear <em>Copyright Year</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Copyright Year</em>' attribute.
+   * @see #getCopyrightYear()
+   * @generated
+   */
+  void setCopyrightYear(String value);
+
+  /**
+   * Returns the value of the '<em><b>Copyright Text</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Copyright Text</em>' attribute.
+   * @see #setCopyrightText(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getCopyrightable_CopyrightText()
+   * @model annotation="http://www.eclipse.org/emf/2002/GenModel propertyMultiLine='true'"
+   *        extendedMetaData="kind='element'"
+   * @generated
+   */
+  String getCopyrightText();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightText <em>Copyright Text</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Copyright Text</em>' attribute.
+   * @see #getCopyrightText()
+   * @generated
+   */
+  void setCopyrightText(String value);
+
+} // Copyrightable
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/JVM.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/JVM.java
new file mode 100644
index 0000000..f22528d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/JVM.java
@@ -0,0 +1,168 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.common.util.EList;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>JVM</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.JVM#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.JVM#getVersion <em>Version</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.JVM#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.JVM#getModel <em>Model</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.JVM#getAboutTextExtra <em>About Text Extra</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.JVM#getVariants <em>Variants</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM()
+ * @model
+ * @generated
+ */
+public interface JVM extends Copyrightable, Touchable
+{
+  /**
+   * Returns the value of the '<em><b>Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Name</em>' attribute.
+   * @see #setName(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM_Name()
+   * @model required="true"
+   * @generated
+   */
+  String getName();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.JVM#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>Version</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Version</em>' attribute.
+   * @see #setVersion(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM_Version()
+   * @model required="true"
+   * @generated
+   */
+  String getVersion();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.JVM#getVersion <em>Version</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Version</em>' attribute.
+   * @see #getVersion()
+   * @generated
+   */
+  void setVersion(String value);
+
+  /**
+   * Returns the value of the '<em><b>Label</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Label</em>' attribute.
+   * @see #setLabel(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM_Label()
+   * @model required="true"
+   * @generated
+   */
+  String getLabel();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.JVM#getLabel <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Label</em>' attribute.
+   * @see #getLabel()
+   * @generated
+   */
+  void setLabel(String value);
+
+  /**
+   * Returns the value of the '<em><b>Variants</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.justj.codegen.model.Variant}.
+   * It is bidirectional and its opposite is '{@link org.eclipse.justj.codegen.model.Variant#getJVM <em>JVM</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Variants</em>' containment reference list.
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM_Variants()
+   * @see org.eclipse.justj.codegen.model.Variant#getJVM
+   * @model opposite="jVM" containment="true" required="true"
+   *        extendedMetaData="name='variant' kind='element'"
+   * @generated
+   */
+  EList<Variant> getVariants();
+
+  /**
+   * Returns the value of the '<em><b>Model</b></em>' container reference.
+   * It is bidirectional and its opposite is '{@link org.eclipse.justj.codegen.model.Model#getJVMs <em>JV Ms</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Model</em>' container reference.
+   * @see #setModel(Model)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM_Model()
+   * @see org.eclipse.justj.codegen.model.Model#getJVMs
+   * @model opposite="jVMs" resolveProxies="false"
+   * @generated
+   */
+  Model getModel();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.JVM#getModel <em>Model</em>}' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Model</em>' container reference.
+   * @see #getModel()
+   * @generated
+   */
+  void setModel(Model value);
+
+  /**
+   * Returns the value of the '<em><b>About Text Extra</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>About Text Extra</em>' attribute.
+   * @see #setAboutTextExtra(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getJVM_AboutTextExtra()
+   * @model annotation="http://www.eclipse.org/emf/2002/GenModel propertyMultiLine='true'"
+   *        extendedMetaData="kind='element'"
+   * @generated
+   */
+  String getAboutTextExtra();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.JVM#getAboutTextExtra <em>About Text Extra</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>About Text Extra</em>' attribute.
+   * @see #getAboutTextExtra()
+   * @generated
+   */
+  void setAboutTextExtra(String value);
+
+} // JVM
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Model.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Model.java
new file mode 100644
index 0000000..247a0f4
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Model.java
@@ -0,0 +1,258 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.common.util.EList;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Model</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getProvider <em>Provider</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getProviderImageName <em>Provider Image Name</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getProviderImageData <em>Provider Image Data</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getAboutURL <em>About URL</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getSource <em>Source</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getLocalCache <em>Local Cache</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Model#getJVMs <em>JV Ms</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getModel()
+ * @model
+ * @generated
+ */
+public interface Model extends Copyrightable, Touchable
+{
+  /**
+   * Returns the value of the '<em><b>Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Name</em>' attribute.
+   * @see #setName(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_Name()
+   * @model required="true"
+   * @generated
+   */
+  String getName();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#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>Label</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Label</em>' attribute.
+   * @see #setLabel(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_Label()
+   * @model required="true"
+   * @generated
+   */
+  String getLabel();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getLabel <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Label</em>' attribute.
+   * @see #getLabel()
+   * @generated
+   */
+  void setLabel(String value);
+
+  /**
+   * Returns the value of the '<em><b>JV Ms</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.justj.codegen.model.JVM}.
+   * It is bidirectional and its opposite is '{@link org.eclipse.justj.codegen.model.JVM#getModel <em>Model</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>JV Ms</em>' containment reference list.
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_JVMs()
+   * @see org.eclipse.justj.codegen.model.JVM#getModel
+   * @model opposite="model" containment="true" required="true"
+   *        extendedMetaData="name='jvm' kind='element'"
+   * @generated
+   */
+  EList<JVM> getJVMs();
+
+  /**
+   * Returns the value of the '<em><b>Provider</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Provider</em>' attribute.
+   * @see #setProvider(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_Provider()
+   * @model required="true"
+   * @generated
+   */
+  String getProvider();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getProvider <em>Provider</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Provider</em>' attribute.
+   * @see #getProvider()
+   * @generated
+   */
+  void setProvider(String value);
+
+  /**
+   * Returns the value of the '<em><b>Provider Image Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Provider Image Name</em>' attribute.
+   * @see #setProviderImageName(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_ProviderImageName()
+   * @model required="true"
+   * @generated
+   */
+  String getProviderImageName();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getProviderImageName <em>Provider Image Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Provider Image Name</em>' attribute.
+   * @see #getProviderImageName()
+   * @generated
+   */
+  void setProviderImageName(String value);
+
+  /**
+   * Returns the value of the '<em><b>Provider Image Data</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Provider Image Data</em>' attribute.
+   * @see #setProviderImageData(byte[])
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_ProviderImageData()
+   * @model dataType="org.eclipse.emf.ecore.xml.type.Base64Binary" required="true"
+   * @generated
+   */
+  byte[] getProviderImageData();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getProviderImageData <em>Provider Image Data</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Provider Image Data</em>' attribute.
+   * @see #getProviderImageData()
+   * @generated
+   */
+  void setProviderImageData(byte[] value);
+
+  /**
+   * Returns the value of the '<em><b>About URL</b></em>' attribute.
+   * The default value is <code>"https://www.eclipse.org/legal/epl/epl-2.0/about.html"</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>About URL</em>' attribute.
+   * @see #setAboutURL(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_AboutURL()
+   * @model default="https://www.eclipse.org/legal/epl/epl-2.0/about.html"
+   * @generated
+   */
+  String getAboutURL();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getAboutURL <em>About URL</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>About URL</em>' attribute.
+   * @see #getAboutURL()
+   * @generated
+   */
+  void setAboutURL(String value);
+
+  /**
+   * Returns the value of the '<em><b>Target</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Target</em>' attribute.
+   * @see #setTarget(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_Target()
+   * @model required="true"
+   * @generated
+   */
+  String getTarget();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getTarget <em>Target</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Target</em>' attribute.
+   * @see #getTarget()
+   * @generated
+   */
+  void setTarget(String value);
+
+  /**
+   * Returns the value of the '<em><b>Source</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Source</em>' attribute.
+   * @see #setSource(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_Source()
+   * @model
+   * @generated
+   */
+  String getSource();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getSource <em>Source</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Source</em>' attribute.
+   * @see #getSource()
+   * @generated
+   */
+  void setSource(String value);
+
+  /**
+   * Returns the value of the '<em><b>Local Cache</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Local Cache</em>' attribute.
+   * @see #setLocalCache(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getModel_LocalCache()
+   * @model
+   * @generated
+   */
+  String getLocalCache();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Model#getLocalCache <em>Local Cache</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Local Cache</em>' attribute.
+   * @see #getLocalCache()
+   * @generated
+   */
+  void setLocalCache(String value);
+
+} // Model
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelFactory.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelFactory.java
new file mode 100644
index 0000000..66ed585
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelFactory.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.ecore.EFactory;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.ModelPackage
+ * @generated
+ */
+public interface ModelFactory extends EFactory
+{
+  /**
+   * The singleton instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  ModelFactory eINSTANCE = org.eclipse.justj.codegen.model.impl.ModelFactoryImpl.init();
+
+  /**
+   * Returns a new object of class '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Model</em>'.
+   * @generated
+   */
+  Model createModel();
+
+  /**
+   * Returns a new object of class '<em>JVM</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>JVM</em>'.
+   * @generated
+   */
+  JVM createJVM();
+
+  /**
+   * Returns a new object of class '<em>Variant</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Variant</em>'.
+   * @generated
+   */
+  Variant createVariant();
+
+  /**
+   * Returns a new object of class '<em>Touchpoint</em>'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return a new object of class '<em>Touchpoint</em>'.
+   * @generated
+   */
+  Touchpoint createTouchpoint();
+
+  /**
+   * Returns the package supported by this factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the package supported by this factory.
+   * @generated
+   */
+  ModelPackage getModelPackage();
+
+} //ModelFactory
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelPackage.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelPackage.java
new file mode 100644
index 0000000..6762339
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelPackage.java
@@ -0,0 +1,1288 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.ModelFactory
+ * @model kind="package"
+ *        annotation="http://www.eclipse.org/emf/2002/GenModel copyrightText='Copyright (c) 2020 Eclipse contributors and others.\n\nThis program and the accompanying materials\nare made available under the terms of the Eclipse Public License 2.0\nwhich accompanies this distribution, and is available at\nhttps://www.eclipse.org/legal/epl-2.0/\n\nSPDX-License-Identifier: EPL-2.0'"
+ * @generated
+ */
+public interface ModelPackage extends EPackage
+{
+  /**
+   * The package name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNAME = "model";
+
+  /**
+   * The package namespace URI.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_URI = "http://www.eclipse.org/just/2020/Model";
+
+  /**
+   * The package namespace name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eNS_PREFIX = "model";
+
+  /**
+   * The package content type ID.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  String eCONTENT_TYPE = "org.eclipse.justj.codegen";
+
+  /**
+   * The singleton instance of the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  ModelPackage eINSTANCE = org.eclipse.justj.codegen.model.impl.ModelPackageImpl.init();
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.impl.CopyrightableImpl <em>Copyrightable</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.impl.CopyrightableImpl
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getCopyrightable()
+   * @generated
+   */
+  int COPYRIGHTABLE = 3;
+
+  /**
+   * The feature id for the '<em><b>Copyright Holder</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int COPYRIGHTABLE__COPYRIGHT_HOLDER = 0;
+
+  /**
+   * The feature id for the '<em><b>Copyright Year</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int COPYRIGHTABLE__COPYRIGHT_YEAR = 1;
+
+  /**
+   * The feature id for the '<em><b>Copyright Text</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int COPYRIGHTABLE__COPYRIGHT_TEXT = 2;
+
+  /**
+   * The number of structural features of the '<em>Copyrightable</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int COPYRIGHTABLE_FEATURE_COUNT = 3;
+
+  /**
+   * The number of operations of the '<em>Copyrightable</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int COPYRIGHTABLE_OPERATION_COUNT = 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.impl.ModelImpl <em>Model</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.impl.ModelImpl
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getModel()
+   * @generated
+   */
+  int MODEL = 0;
+
+  /**
+   * The feature id for the '<em><b>Copyright Holder</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__COPYRIGHT_HOLDER = COPYRIGHTABLE__COPYRIGHT_HOLDER;
+
+  /**
+   * The feature id for the '<em><b>Copyright Year</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__COPYRIGHT_YEAR = COPYRIGHTABLE__COPYRIGHT_YEAR;
+
+  /**
+   * The feature id for the '<em><b>Copyright Text</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__COPYRIGHT_TEXT = COPYRIGHTABLE__COPYRIGHT_TEXT;
+
+  /**
+   * The feature id for the '<em><b>Touchpoints</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__TOUCHPOINTS = COPYRIGHTABLE_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__NAME = COPYRIGHTABLE_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Label</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__LABEL = COPYRIGHTABLE_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>Provider</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__PROVIDER = COPYRIGHTABLE_FEATURE_COUNT + 3;
+
+  /**
+   * The feature id for the '<em><b>Provider Image Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__PROVIDER_IMAGE_NAME = COPYRIGHTABLE_FEATURE_COUNT + 4;
+
+  /**
+   * The feature id for the '<em><b>Provider Image Data</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__PROVIDER_IMAGE_DATA = COPYRIGHTABLE_FEATURE_COUNT + 5;
+
+  /**
+   * The feature id for the '<em><b>About URL</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__ABOUT_URL = COPYRIGHTABLE_FEATURE_COUNT + 6;
+
+  /**
+   * The feature id for the '<em><b>Target</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__TARGET = COPYRIGHTABLE_FEATURE_COUNT + 7;
+
+  /**
+   * The feature id for the '<em><b>Source</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__SOURCE = COPYRIGHTABLE_FEATURE_COUNT + 8;
+
+  /**
+   * The feature id for the '<em><b>Local Cache</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__LOCAL_CACHE = COPYRIGHTABLE_FEATURE_COUNT + 9;
+
+  /**
+   * The feature id for the '<em><b>JV Ms</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL__JV_MS = COPYRIGHTABLE_FEATURE_COUNT + 10;
+
+  /**
+   * The number of structural features of the '<em>Model</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_FEATURE_COUNT = COPYRIGHTABLE_FEATURE_COUNT + 11;
+
+  /**
+   * The number of operations of the '<em>Model</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int MODEL_OPERATION_COUNT = COPYRIGHTABLE_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.impl.JVMImpl <em>JVM</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.impl.JVMImpl
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getJVM()
+   * @generated
+   */
+  int JVM = 1;
+
+  /**
+   * The feature id for the '<em><b>Copyright Holder</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__COPYRIGHT_HOLDER = COPYRIGHTABLE__COPYRIGHT_HOLDER;
+
+  /**
+   * The feature id for the '<em><b>Copyright Year</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__COPYRIGHT_YEAR = COPYRIGHTABLE__COPYRIGHT_YEAR;
+
+  /**
+   * The feature id for the '<em><b>Copyright Text</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__COPYRIGHT_TEXT = COPYRIGHTABLE__COPYRIGHT_TEXT;
+
+  /**
+   * The feature id for the '<em><b>Touchpoints</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__TOUCHPOINTS = COPYRIGHTABLE_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>Name</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__NAME = COPYRIGHTABLE_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Version</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__VERSION = COPYRIGHTABLE_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>Label</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__LABEL = COPYRIGHTABLE_FEATURE_COUNT + 3;
+
+  /**
+   * The feature id for the '<em><b>Model</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__MODEL = COPYRIGHTABLE_FEATURE_COUNT + 4;
+
+  /**
+   * The feature id for the '<em><b>About Text Extra</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__ABOUT_TEXT_EXTRA = COPYRIGHTABLE_FEATURE_COUNT + 5;
+
+  /**
+   * The feature id for the '<em><b>Variants</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM__VARIANTS = COPYRIGHTABLE_FEATURE_COUNT + 6;
+
+  /**
+   * The number of structural features of the '<em>JVM</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM_FEATURE_COUNT = COPYRIGHTABLE_FEATURE_COUNT + 7;
+
+  /**
+   * The number of operations of the '<em>JVM</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int JVM_OPERATION_COUNT = COPYRIGHTABLE_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.impl.VariantImpl <em>Variant</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.impl.VariantImpl
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getVariant()
+   * @generated
+   */
+  int VARIANT = 2;
+
+  /**
+   * The feature id for the '<em><b>Copyright Holder</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__COPYRIGHT_HOLDER = COPYRIGHTABLE__COPYRIGHT_HOLDER;
+
+  /**
+   * The feature id for the '<em><b>Copyright Year</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__COPYRIGHT_YEAR = COPYRIGHTABLE__COPYRIGHT_YEAR;
+
+  /**
+   * The feature id for the '<em><b>Copyright Text</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__COPYRIGHT_TEXT = COPYRIGHTABLE__COPYRIGHT_TEXT;
+
+  /**
+   * The feature id for the '<em><b>Touchpoints</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__TOUCHPOINTS = COPYRIGHTABLE_FEATURE_COUNT + 0;
+
+  /**
+   * The feature id for the '<em><b>Os</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__OS = COPYRIGHTABLE_FEATURE_COUNT + 1;
+
+  /**
+   * The feature id for the '<em><b>Arch</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__ARCH = COPYRIGHTABLE_FEATURE_COUNT + 2;
+
+  /**
+   * The feature id for the '<em><b>Label</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__LABEL = COPYRIGHTABLE_FEATURE_COUNT + 3;
+
+  /**
+   * The feature id for the '<em><b>Source</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__SOURCE = COPYRIGHTABLE_FEATURE_COUNT + 4;
+
+  /**
+   * The feature id for the '<em><b>JVM</b></em>' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT__JVM = COPYRIGHTABLE_FEATURE_COUNT + 5;
+
+  /**
+   * The number of structural features of the '<em>Variant</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT_FEATURE_COUNT = COPYRIGHTABLE_FEATURE_COUNT + 6;
+
+  /**
+   * The number of operations of the '<em>Variant</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int VARIANT_OPERATION_COUNT = COPYRIGHTABLE_OPERATION_COUNT + 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.impl.TouchpointImpl <em>Touchpoint</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.impl.TouchpointImpl
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getTouchpoint()
+   * @generated
+   */
+  int TOUCHPOINT = 4;
+
+  /**
+   * The feature id for the '<em><b>Phase</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHPOINT__PHASE = 0;
+
+  /**
+   * The feature id for the '<em><b>Instructions</b></em>' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHPOINT__INSTRUCTIONS = 1;
+
+  /**
+   * The number of structural features of the '<em>Touchpoint</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHPOINT_FEATURE_COUNT = 2;
+
+  /**
+   * The number of operations of the '<em>Touchpoint</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHPOINT_OPERATION_COUNT = 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.Touchable <em>Touchable</em>}' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.Touchable
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getTouchable()
+   * @generated
+   */
+  int TOUCHABLE = 5;
+
+  /**
+   * The feature id for the '<em><b>Touchpoints</b></em>' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHABLE__TOUCHPOINTS = 0;
+
+  /**
+   * The number of structural features of the '<em>Touchable</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHABLE_FEATURE_COUNT = 1;
+
+  /**
+   * The number of operations of the '<em>Touchable</em>' class.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  int TOUCHABLE_OPERATION_COUNT = 0;
+
+  /**
+   * The meta object id for the '{@link org.eclipse.justj.codegen.model.Phase <em>Phase</em>}' enum.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.justj.codegen.model.Phase
+   * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getPhase()
+   * @generated
+   */
+  int PHASE = 6;
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.justj.codegen.model.Model <em>Model</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Model</em>'.
+   * @see org.eclipse.justj.codegen.model.Model
+   * @generated
+   */
+  EClass getModel();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getName <em>Name</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Name</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getName()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_Name();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getLabel <em>Label</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Label</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getLabel()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_Label();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.justj.codegen.model.Model#getJVMs <em>JV Ms</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>JV Ms</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getJVMs()
+   * @see #getModel()
+   * @generated
+   */
+  EReference getModel_JVMs();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getProvider <em>Provider</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Provider</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getProvider()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_Provider();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getProviderImageName <em>Provider Image Name</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Provider Image Name</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getProviderImageName()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_ProviderImageName();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getProviderImageData <em>Provider Image Data</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Provider Image Data</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getProviderImageData()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_ProviderImageData();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getAboutURL <em>About URL</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>About URL</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getAboutURL()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_AboutURL();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getTarget <em>Target</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Target</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getTarget()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_Target();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getSource <em>Source</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Source</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getSource()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_Source();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Model#getLocalCache <em>Local Cache</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Local Cache</em>'.
+   * @see org.eclipse.justj.codegen.model.Model#getLocalCache()
+   * @see #getModel()
+   * @generated
+   */
+  EAttribute getModel_LocalCache();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.justj.codegen.model.JVM <em>JVM</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>JVM</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM
+   * @generated
+   */
+  EClass getJVM();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.JVM#getName <em>Name</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Name</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM#getName()
+   * @see #getJVM()
+   * @generated
+   */
+  EAttribute getJVM_Name();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.JVM#getVersion <em>Version</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Version</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM#getVersion()
+   * @see #getJVM()
+   * @generated
+   */
+  EAttribute getJVM_Version();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.JVM#getLabel <em>Label</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Label</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM#getLabel()
+   * @see #getJVM()
+   * @generated
+   */
+  EAttribute getJVM_Label();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.justj.codegen.model.JVM#getVariants <em>Variants</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Variants</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM#getVariants()
+   * @see #getJVM()
+   * @generated
+   */
+  EReference getJVM_Variants();
+
+  /**
+   * Returns the meta object for the container reference '{@link org.eclipse.justj.codegen.model.JVM#getModel <em>Model</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the container reference '<em>Model</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM#getModel()
+   * @see #getJVM()
+   * @generated
+   */
+  EReference getJVM_Model();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.JVM#getAboutTextExtra <em>About Text Extra</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>About Text Extra</em>'.
+   * @see org.eclipse.justj.codegen.model.JVM#getAboutTextExtra()
+   * @see #getJVM()
+   * @generated
+   */
+  EAttribute getJVM_AboutTextExtra();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.justj.codegen.model.Variant <em>Variant</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Variant</em>'.
+   * @see org.eclipse.justj.codegen.model.Variant
+   * @generated
+   */
+  EClass getVariant();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Variant#getOs <em>Os</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Os</em>'.
+   * @see org.eclipse.justj.codegen.model.Variant#getOs()
+   * @see #getVariant()
+   * @generated
+   */
+  EAttribute getVariant_Os();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Variant#getArch <em>Arch</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Arch</em>'.
+   * @see org.eclipse.justj.codegen.model.Variant#getArch()
+   * @see #getVariant()
+   * @generated
+   */
+  EAttribute getVariant_Arch();
+
+  /**
+   * Returns the meta object for the container reference '{@link org.eclipse.justj.codegen.model.Variant#getJVM <em>JVM</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the container reference '<em>JVM</em>'.
+   * @see org.eclipse.justj.codegen.model.Variant#getJVM()
+   * @see #getVariant()
+   * @generated
+   */
+  EReference getVariant_JVM();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Variant#getLabel <em>Label</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Label</em>'.
+   * @see org.eclipse.justj.codegen.model.Variant#getLabel()
+   * @see #getVariant()
+   * @generated
+   */
+  EAttribute getVariant_Label();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Variant#getSource <em>Source</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Source</em>'.
+   * @see org.eclipse.justj.codegen.model.Variant#getSource()
+   * @see #getVariant()
+   * @generated
+   */
+  EAttribute getVariant_Source();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.justj.codegen.model.Copyrightable <em>Copyrightable</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Copyrightable</em>'.
+   * @see org.eclipse.justj.codegen.model.Copyrightable
+   * @generated
+   */
+  EClass getCopyrightable();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightHolder <em>Copyright Holder</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Copyright Holder</em>'.
+   * @see org.eclipse.justj.codegen.model.Copyrightable#getCopyrightHolder()
+   * @see #getCopyrightable()
+   * @generated
+   */
+  EAttribute getCopyrightable_CopyrightHolder();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightYear <em>Copyright Year</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Copyright Year</em>'.
+   * @see org.eclipse.justj.codegen.model.Copyrightable#getCopyrightYear()
+   * @see #getCopyrightable()
+   * @generated
+   */
+  EAttribute getCopyrightable_CopyrightYear();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Copyrightable#getCopyrightText <em>Copyright Text</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Copyright Text</em>'.
+   * @see org.eclipse.justj.codegen.model.Copyrightable#getCopyrightText()
+   * @see #getCopyrightable()
+   * @generated
+   */
+  EAttribute getCopyrightable_CopyrightText();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.justj.codegen.model.Touchpoint <em>Touchpoint</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Touchpoint</em>'.
+   * @see org.eclipse.justj.codegen.model.Touchpoint
+   * @generated
+   */
+  EClass getTouchpoint();
+
+  /**
+   * Returns the meta object for the attribute '{@link org.eclipse.justj.codegen.model.Touchpoint#getPhase <em>Phase</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute '<em>Phase</em>'.
+   * @see org.eclipse.justj.codegen.model.Touchpoint#getPhase()
+   * @see #getTouchpoint()
+   * @generated
+   */
+  EAttribute getTouchpoint_Phase();
+
+  /**
+   * Returns the meta object for the attribute list '{@link org.eclipse.justj.codegen.model.Touchpoint#getInstructions <em>Instructions</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the attribute list '<em>Instructions</em>'.
+   * @see org.eclipse.justj.codegen.model.Touchpoint#getInstructions()
+   * @see #getTouchpoint()
+   * @generated
+   */
+  EAttribute getTouchpoint_Instructions();
+
+  /**
+   * Returns the meta object for class '{@link org.eclipse.justj.codegen.model.Touchable <em>Touchable</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for class '<em>Touchable</em>'.
+   * @see org.eclipse.justj.codegen.model.Touchable
+   * @generated
+   */
+  EClass getTouchable();
+
+  /**
+   * Returns the meta object for the containment reference list '{@link org.eclipse.justj.codegen.model.Touchable#getTouchpoints <em>Touchpoints</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for the containment reference list '<em>Touchpoints</em>'.
+   * @see org.eclipse.justj.codegen.model.Touchable#getTouchpoints()
+   * @see #getTouchable()
+   * @generated
+   */
+  EReference getTouchable_Touchpoints();
+
+  /**
+   * Returns the meta object for enum '{@link org.eclipse.justj.codegen.model.Phase <em>Phase</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the meta object for enum '<em>Phase</em>'.
+   * @see org.eclipse.justj.codegen.model.Phase
+   * @generated
+   */
+  EEnum getPhase();
+
+  /**
+   * Returns the factory that creates the instances of the model.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the factory that creates the instances of the model.
+   * @generated
+   */
+  ModelFactory getModelFactory();
+
+  /**
+   * <!-- begin-user-doc -->
+   * Defines literals for the meta objects that represent
+   * <ul>
+   *   <li>each class,</li>
+   *   <li>each feature of each class,</li>
+   *   <li>each operation of each class,</li>
+   *   <li>each enum,</li>
+   *   <li>and each data type</li>
+   * </ul>
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  interface Literals
+  {
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.impl.ModelImpl <em>Model</em>}' class.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelImpl
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getModel()
+    	 * @generated
+    	 */
+    EClass MODEL = eINSTANCE.getModel();
+
+    /**
+    	 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__NAME = eINSTANCE.getModel_Name();
+
+    /**
+    	 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__LABEL = eINSTANCE.getModel_Label();
+
+    /**
+    	 * The meta object literal for the '<em><b>JV Ms</b></em>' containment reference list feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EReference MODEL__JV_MS = eINSTANCE.getModel_JVMs();
+
+    /**
+    	 * The meta object literal for the '<em><b>Provider</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__PROVIDER = eINSTANCE.getModel_Provider();
+
+    /**
+    	 * The meta object literal for the '<em><b>Provider Image Name</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__PROVIDER_IMAGE_NAME = eINSTANCE.getModel_ProviderImageName();
+
+    /**
+    	 * The meta object literal for the '<em><b>Provider Image Data</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__PROVIDER_IMAGE_DATA = eINSTANCE.getModel_ProviderImageData();
+
+    /**
+    	 * The meta object literal for the '<em><b>About URL</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__ABOUT_URL = eINSTANCE.getModel_AboutURL();
+
+    /**
+    	 * The meta object literal for the '<em><b>Target</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__TARGET = eINSTANCE.getModel_Target();
+
+    /**
+    	 * The meta object literal for the '<em><b>Source</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__SOURCE = eINSTANCE.getModel_Source();
+
+    /**
+    	 * The meta object literal for the '<em><b>Local Cache</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute MODEL__LOCAL_CACHE = eINSTANCE.getModel_LocalCache();
+
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.impl.JVMImpl <em>JVM</em>}' class.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.impl.JVMImpl
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getJVM()
+    	 * @generated
+    	 */
+    EClass JVM = eINSTANCE.getJVM();
+
+    /**
+    	 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute JVM__NAME = eINSTANCE.getJVM_Name();
+
+    /**
+    	 * The meta object literal for the '<em><b>Version</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute JVM__VERSION = eINSTANCE.getJVM_Version();
+
+    /**
+    	 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute JVM__LABEL = eINSTANCE.getJVM_Label();
+
+    /**
+    	 * The meta object literal for the '<em><b>Variants</b></em>' containment reference list feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EReference JVM__VARIANTS = eINSTANCE.getJVM_Variants();
+
+    /**
+    	 * The meta object literal for the '<em><b>Model</b></em>' container reference feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EReference JVM__MODEL = eINSTANCE.getJVM_Model();
+
+    /**
+    	 * The meta object literal for the '<em><b>About Text Extra</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute JVM__ABOUT_TEXT_EXTRA = eINSTANCE.getJVM_AboutTextExtra();
+
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.impl.VariantImpl <em>Variant</em>}' class.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.impl.VariantImpl
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getVariant()
+    	 * @generated
+    	 */
+    EClass VARIANT = eINSTANCE.getVariant();
+
+    /**
+    	 * The meta object literal for the '<em><b>Os</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute VARIANT__OS = eINSTANCE.getVariant_Os();
+
+    /**
+    	 * The meta object literal for the '<em><b>Arch</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute VARIANT__ARCH = eINSTANCE.getVariant_Arch();
+
+    /**
+    	 * The meta object literal for the '<em><b>JVM</b></em>' container reference feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EReference VARIANT__JVM = eINSTANCE.getVariant_JVM();
+
+    /**
+    	 * The meta object literal for the '<em><b>Label</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute VARIANT__LABEL = eINSTANCE.getVariant_Label();
+
+    /**
+    	 * The meta object literal for the '<em><b>Source</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute VARIANT__SOURCE = eINSTANCE.getVariant_Source();
+
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.impl.CopyrightableImpl <em>Copyrightable</em>}' class.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.impl.CopyrightableImpl
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getCopyrightable()
+    	 * @generated
+    	 */
+    EClass COPYRIGHTABLE = eINSTANCE.getCopyrightable();
+
+    /**
+    	 * The meta object literal for the '<em><b>Copyright Holder</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute COPYRIGHTABLE__COPYRIGHT_HOLDER = eINSTANCE.getCopyrightable_CopyrightHolder();
+
+    /**
+    	 * The meta object literal for the '<em><b>Copyright Year</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute COPYRIGHTABLE__COPYRIGHT_YEAR = eINSTANCE.getCopyrightable_CopyrightYear();
+
+    /**
+    	 * The meta object literal for the '<em><b>Copyright Text</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute COPYRIGHTABLE__COPYRIGHT_TEXT = eINSTANCE.getCopyrightable_CopyrightText();
+
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.impl.TouchpointImpl <em>Touchpoint</em>}' class.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.impl.TouchpointImpl
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getTouchpoint()
+    	 * @generated
+    	 */
+    EClass TOUCHPOINT = eINSTANCE.getTouchpoint();
+
+    /**
+    	 * The meta object literal for the '<em><b>Phase</b></em>' attribute feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute TOUCHPOINT__PHASE = eINSTANCE.getTouchpoint_Phase();
+
+    /**
+    	 * The meta object literal for the '<em><b>Instructions</b></em>' attribute list feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EAttribute TOUCHPOINT__INSTRUCTIONS = eINSTANCE.getTouchpoint_Instructions();
+
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.Touchable <em>Touchable</em>}' class.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.Touchable
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getTouchable()
+    	 * @generated
+    	 */
+    EClass TOUCHABLE = eINSTANCE.getTouchable();
+
+    /**
+    	 * The meta object literal for the '<em><b>Touchpoints</b></em>' containment reference list feature.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    EReference TOUCHABLE__TOUCHPOINTS = eINSTANCE.getTouchable_Touchpoints();
+
+    /**
+    	 * The meta object literal for the '{@link org.eclipse.justj.codegen.model.Phase <em>Phase</em>}' enum.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @see org.eclipse.justj.codegen.model.Phase
+    	 * @see org.eclipse.justj.codegen.model.impl.ModelPackageImpl#getPhase()
+    	 * @generated
+    	 */
+    EEnum PHASE = eINSTANCE.getPhase();
+
+  }
+
+} //ModelPackage
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelPlugin.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelPlugin.java
new file mode 100644
index 0000000..c815f73
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/ModelPlugin.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.common.EMFPlugin;
+import org.eclipse.emf.common.util.ResourceLocator;
+
+
+/**
+ * This is the central singleton for the Model model plugin.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public final class ModelPlugin extends EMFPlugin
+{
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final ModelPlugin INSTANCE = new ModelPlugin();
+
+  /**
+   * Keep track of the singleton.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static Implementation plugin;
+
+  /**
+   * Create the instance.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelPlugin()
+  {
+    super(new ResourceLocator []{});
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  @Override
+  public ResourceLocator getPluginResourceLocator()
+  {
+    return plugin;
+  }
+
+  /**
+   * Returns the singleton instance of the Eclipse plugin.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the singleton instance.
+   * @generated
+   */
+  public static Implementation getPlugin()
+  {
+    return plugin;
+  }
+
+  /**
+   * The actual implementation of the Eclipse <b>Plugin</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static class Implementation extends EclipsePlugin
+  {
+    /**
+    	 * Creates an instance.
+    	 * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+    	 * @generated
+    	 */
+    public Implementation()
+    {
+      super();
+
+      // Remember the static instance.
+      //
+      plugin = this;
+    }
+  }
+
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Phase.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Phase.java
new file mode 100644
index 0000000..08b6f3f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Phase.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Phase</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getPhase()
+ * @model
+ * @generated
+ */
+public enum Phase implements Enumerator
+{
+  /**
+   * The '<em><b>Install</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #INSTALL_VALUE
+   * @generated
+   * @ordered
+   */
+  INSTALL(0, "Install", "install"),
+
+  /**
+   * The '<em><b>Uninstall</b></em>' literal object.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #UNINSTALL_VALUE
+   * @generated
+   * @ordered
+   */
+  UNINSTALL(1, "Uninstall", "uninstall");
+
+  /**
+   * The '<em><b>Install</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #INSTALL
+   * @model name="Install" literal="install"
+   * @generated
+   * @ordered
+   */
+  public static final int INSTALL_VALUE = 0;
+
+  /**
+   * The '<em><b>Uninstall</b></em>' literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #UNINSTALL
+   * @model name="Uninstall" literal="uninstall"
+   * @generated
+   * @ordered
+   */
+  public static final int UNINSTALL_VALUE = 1;
+
+  /**
+   * An array of all the '<em><b>Phase</b></em>' enumerators.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static final Phase[] VALUES_ARRAY = new Phase []{ INSTALL, UNINSTALL, };
+
+  /**
+   * A public read-only list of all the '<em><b>Phase</b></em>' enumerators.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static final List<Phase> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+  /**
+   * Returns the '<em><b>Phase</b></em>' literal with the specified literal value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param literal the literal.
+   * @return the matching enumerator or <code>null</code>.
+   * @generated
+   */
+  public static Phase get(String literal)
+  {
+    for (int i = 0; i < VALUES_ARRAY.length; ++i)
+    {
+      Phase result = VALUES_ARRAY[i];
+      if (result.toString().equals(literal))
+      {
+        return result;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns the '<em><b>Phase</b></em>' literal with the specified name.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param name the name.
+   * @return the matching enumerator or <code>null</code>.
+   * @generated
+   */
+  public static Phase getByName(String name)
+  {
+    for (int i = 0; i < VALUES_ARRAY.length; ++i)
+    {
+      Phase result = VALUES_ARRAY[i];
+      if (result.getName().equals(name))
+      {
+        return result;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Returns the '<em><b>Phase</b></em>' literal with the specified integer value.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the integer value.
+   * @return the matching enumerator or <code>null</code>.
+   * @generated
+   */
+  public static Phase get(int value)
+  {
+    switch (value)
+    {
+      case INSTALL_VALUE:
+        return INSTALL;
+      case UNINSTALL_VALUE:
+        return UNINSTALL;
+    }
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private final int value;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private final String name;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private final String literal;
+
+  /**
+   * Only this class can construct instances.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private Phase(int value, String name, String literal)
+  {
+    this.value = value;
+    this.name = name;
+    this.literal = literal;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int getValue()
+  {
+    return value;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getName()
+  {
+    return name;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getLiteral()
+  {
+    return literal;
+  }
+
+  /**
+   * Returns the literal value of the enumerator, which is its string representation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    return literal;
+  }
+
+} //Phase
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Touchable.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Touchable.java
new file mode 100644
index 0000000..947cb2d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Touchable.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Touchable</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.Touchable#getTouchpoints <em>Touchpoints</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getTouchable()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface Touchable extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Touchpoints</b></em>' containment reference list.
+   * The list contents are of type {@link org.eclipse.justj.codegen.model.Touchpoint}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Touchpoints</em>' containment reference list.
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getTouchable_Touchpoints()
+   * @model containment="true"
+   * @generated
+   */
+  EList<Touchpoint> getTouchpoints();
+
+} // Touchable
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Touchpoint.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Touchpoint.java
new file mode 100644
index 0000000..844213d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Touchpoint.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Touchpoint</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.Touchpoint#getPhase <em>Phase</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Touchpoint#getInstructions <em>Instructions</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getTouchpoint()
+ * @model
+ * @generated
+ */
+public interface Touchpoint extends EObject
+{
+  /**
+   * Returns the value of the '<em><b>Phase</b></em>' attribute.
+   * The literals are from the enumeration {@link org.eclipse.justj.codegen.model.Phase}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Phase</em>' attribute.
+   * @see org.eclipse.justj.codegen.model.Phase
+   * @see #setPhase(Phase)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getTouchpoint_Phase()
+   * @model
+   * @generated
+   */
+  Phase getPhase();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Touchpoint#getPhase <em>Phase</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Phase</em>' attribute.
+   * @see org.eclipse.justj.codegen.model.Phase
+   * @see #getPhase()
+   * @generated
+   */
+  void setPhase(Phase value);
+
+  /**
+   * Returns the value of the '<em><b>Instructions</b></em>' attribute list.
+   * The list contents are of type {@link java.lang.String}.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Instructions</em>' attribute list.
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getTouchpoint_Instructions()
+   * @model unique="false" required="true"
+   *        extendedMetaData="kind='element' name='instruction'"
+   * @generated
+   */
+  EList<String> getInstructions();
+
+} // Touchpoint
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Variant.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Variant.java
new file mode 100644
index 0000000..f09f977
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/Variant.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Variant</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.Variant#getOs <em>Os</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Variant#getArch <em>Arch</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Variant#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Variant#getSource <em>Source</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.Variant#getJVM <em>JVM</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.justj.codegen.model.ModelPackage#getVariant()
+ * @model
+ * @generated
+ */
+public interface Variant extends Copyrightable, Touchable
+{
+  /**
+   * Returns the value of the '<em><b>Os</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Os</em>' attribute.
+   * @see #setOs(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getVariant_Os()
+   * @model required="true"
+   * @generated
+   */
+  String getOs();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Variant#getOs <em>Os</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Os</em>' attribute.
+   * @see #getOs()
+   * @generated
+   */
+  void setOs(String value);
+
+  /**
+   * Returns the value of the '<em><b>Arch</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Arch</em>' attribute.
+   * @see #setArch(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getVariant_Arch()
+   * @model required="true"
+   * @generated
+   */
+  String getArch();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Variant#getArch <em>Arch</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Arch</em>' attribute.
+   * @see #getArch()
+   * @generated
+   */
+  void setArch(String value);
+
+  /**
+   * Returns the value of the '<em><b>JVM</b></em>' container reference.
+   * It is bidirectional and its opposite is '{@link org.eclipse.justj.codegen.model.JVM#getVariants <em>Variants</em>}'.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>JVM</em>' container reference.
+   * @see #setJVM(JVM)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getVariant_JVM()
+   * @see org.eclipse.justj.codegen.model.JVM#getVariants
+   * @model opposite="variants" resolveProxies="false"
+   *        extendedMetaData="name='jvm' kind='element'"
+   * @generated
+   */
+  JVM getJVM();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Variant#getJVM <em>JVM</em>}' container reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>JVM</em>' container reference.
+   * @see #getJVM()
+   * @generated
+   */
+  void setJVM(JVM value);
+
+  /**
+   * Returns the value of the '<em><b>Label</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Label</em>' attribute.
+   * @see #setLabel(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getVariant_Label()
+   * @model required="true"
+   * @generated
+   */
+  String getLabel();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Variant#getLabel <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Label</em>' attribute.
+   * @see #getLabel()
+   * @generated
+   */
+  void setLabel(String value);
+
+  /**
+   * Returns the value of the '<em><b>Source</b></em>' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the value of the '<em>Source</em>' attribute.
+   * @see #setSource(String)
+   * @see org.eclipse.justj.codegen.model.ModelPackage#getVariant_Source()
+   * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+   * @generated
+   */
+  String getSource();
+
+  /**
+   * Sets the value of the '{@link org.eclipse.justj.codegen.model.Variant#getSource <em>Source</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param value the new value of the '<em>Source</em>' attribute.
+   * @see #getSource()
+   * @generated
+   */
+  void setSource(String value);
+
+} // Variant
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/CopyrightableImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/CopyrightableImpl.java
new file mode 100644
index 0000000..d3644b1
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/CopyrightableImpl.java
@@ -0,0 +1,311 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.ModelPackage;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Copyrightable</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.CopyrightableImpl#getCopyrightHolder <em>Copyright Holder</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.CopyrightableImpl#getCopyrightYear <em>Copyright Year</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.CopyrightableImpl#getCopyrightText <em>Copyright Text</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class CopyrightableImpl extends MinimalEObjectImpl.Container implements Copyrightable
+{
+  /**
+   * The default value of the '{@link #getCopyrightHolder() <em>Copyright Holder</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getCopyrightHolder()
+   * @generated
+   * @ordered
+   */
+  protected static final String COPYRIGHT_HOLDER_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getCopyrightHolder() <em>Copyright Holder</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getCopyrightHolder()
+   * @generated
+   * @ordered
+   */
+  protected String copyrightHolder = COPYRIGHT_HOLDER_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getCopyrightYear() <em>Copyright Year</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getCopyrightYear()
+   * @generated
+   * @ordered
+   */
+  protected static final String COPYRIGHT_YEAR_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getCopyrightYear() <em>Copyright Year</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getCopyrightYear()
+   * @generated
+   * @ordered
+   */
+  protected String copyrightYear = COPYRIGHT_YEAR_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getCopyrightText() <em>Copyright Text</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getCopyrightText()
+   * @generated
+   * @ordered
+   */
+  protected static final String COPYRIGHT_TEXT_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getCopyrightText() <em>Copyright Text</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getCopyrightText()
+   * @generated
+   * @ordered
+   */
+  protected String copyrightText = COPYRIGHT_TEXT_EDEFAULT;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected CopyrightableImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ModelPackage.Literals.COPYRIGHTABLE;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getCopyrightHolder()
+  {
+    return copyrightHolder;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setCopyrightHolder(String newCopyrightHolder)
+  {
+    String oldCopyrightHolder = copyrightHolder;
+    copyrightHolder = newCopyrightHolder;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.COPYRIGHTABLE__COPYRIGHT_HOLDER, oldCopyrightHolder, copyrightHolder));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getCopyrightYear()
+  {
+    return copyrightYear;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setCopyrightYear(String newCopyrightYear)
+  {
+    String oldCopyrightYear = copyrightYear;
+    copyrightYear = newCopyrightYear;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.COPYRIGHTABLE__COPYRIGHT_YEAR, oldCopyrightYear, copyrightYear));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getCopyrightText()
+  {
+    return copyrightText;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setCopyrightText(String newCopyrightText)
+  {
+    String oldCopyrightText = copyrightText;
+    copyrightText = newCopyrightText;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.COPYRIGHTABLE__COPYRIGHT_TEXT, oldCopyrightText, copyrightText));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_HOLDER:
+        return getCopyrightHolder();
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_YEAR:
+        return getCopyrightYear();
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_TEXT:
+        return getCopyrightText();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_HOLDER:
+        setCopyrightHolder((String)newValue);
+        return;
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_YEAR:
+        setCopyrightYear((String)newValue);
+        return;
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_TEXT:
+        setCopyrightText((String)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_HOLDER:
+        setCopyrightHolder(COPYRIGHT_HOLDER_EDEFAULT);
+        return;
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_YEAR:
+        setCopyrightYear(COPYRIGHT_YEAR_EDEFAULT);
+        return;
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_TEXT:
+        setCopyrightText(COPYRIGHT_TEXT_EDEFAULT);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_HOLDER:
+        return COPYRIGHT_HOLDER_EDEFAULT == null ? copyrightHolder != null : !COPYRIGHT_HOLDER_EDEFAULT.equals(copyrightHolder);
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_YEAR:
+        return COPYRIGHT_YEAR_EDEFAULT == null ? copyrightYear != null : !COPYRIGHT_YEAR_EDEFAULT.equals(copyrightYear);
+      case ModelPackage.COPYRIGHTABLE__COPYRIGHT_TEXT:
+        return COPYRIGHT_TEXT_EDEFAULT == null ? copyrightText != null : !COPYRIGHT_TEXT_EDEFAULT.equals(copyrightText);
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy())
+    {
+      return super.toString();
+    }
+
+    StringBuilder result = new StringBuilder(super.toString());
+    result.append(" (copyrightHolder: ");
+    result.append(copyrightHolder);
+    result.append(", copyrightYear: ");
+    result.append(copyrightYear);
+    result.append(", copyrightText: ");
+    result.append(copyrightText);
+    result.append(')');
+    return result.toString();
+  }
+
+} //CopyrightableImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/JVMImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/JVMImpl.java
new file mode 100644
index 0000000..296eab9
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/JVMImpl.java
@@ -0,0 +1,631 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>JVM</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getTouchpoints <em>Touchpoints</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getVersion <em>Version</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getModel <em>Model</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getAboutTextExtra <em>About Text Extra</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.JVMImpl#getVariants <em>Variants</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class JVMImpl extends CopyrightableImpl implements JVM
+{
+  /**
+   * The cached value of the '{@link #getTouchpoints() <em>Touchpoints</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTouchpoints()
+   * @generated
+   * @ordered
+   */
+  protected EList<Touchpoint> touchpoints;
+
+  /**
+   * 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 #getVersion() <em>Version</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVersion()
+   * @generated
+   * @ordered
+   */
+  protected static final String VERSION_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getVersion() <em>Version</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVersion()
+   * @generated
+   * @ordered
+   */
+  protected String version = VERSION_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLabel()
+   * @generated
+   * @ordered
+   */
+  protected static final String LABEL_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLabel()
+   * @generated
+   * @ordered
+   */
+  protected String label = LABEL_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getAboutTextExtra() <em>About Text Extra</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getAboutTextExtra()
+   * @generated
+   * @ordered
+   */
+  protected static final String ABOUT_TEXT_EXTRA_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getAboutTextExtra() <em>About Text Extra</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getAboutTextExtra()
+   * @generated
+   * @ordered
+   */
+  protected String aboutTextExtra = ABOUT_TEXT_EXTRA_EDEFAULT;
+
+  /**
+   * The cached value of the '{@link #getVariants() <em>Variants</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVariants()
+   * @generated
+   * @ordered
+   */
+  protected EList<Variant> variants;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected JVMImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ModelPackage.Literals.JVM;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EList<Touchpoint> getTouchpoints()
+  {
+    if (touchpoints == null)
+    {
+      touchpoints = new EObjectContainmentEList<Touchpoint>(Touchpoint.class, this, ModelPackage.JVM__TOUCHPOINTS);
+    }
+    return touchpoints;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getName()
+  {
+    return name;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setName(String newName)
+  {
+    String oldName = name;
+    name = newName;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.JVM__NAME, oldName, name));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getVersion()
+  {
+    return version;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setVersion(String newVersion)
+  {
+    String oldVersion = version;
+    version = newVersion;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.JVM__VERSION, oldVersion, version));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getLabel()
+  {
+    return label;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setLabel(String newLabel)
+  {
+    String oldLabel = label;
+    label = newLabel;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.JVM__LABEL, oldLabel, label));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EList<Variant> getVariants()
+  {
+    if (variants == null)
+    {
+      variants = new EObjectContainmentWithInverseEList<Variant>(Variant.class, this, ModelPackage.JVM__VARIANTS, ModelPackage.VARIANT__JVM);
+    }
+    return variants;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Model getModel()
+  {
+    if (eContainerFeatureID() != ModelPackage.JVM__MODEL)
+    {
+      return null;
+    }
+    return (Model)eInternalContainer();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetModel(Model newModel, NotificationChain msgs)
+  {
+    msgs = eBasicSetContainer((InternalEObject)newModel, ModelPackage.JVM__MODEL, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setModel(Model newModel)
+  {
+    if (newModel != eInternalContainer() || (eContainerFeatureID() != ModelPackage.JVM__MODEL && newModel != null))
+    {
+      if (EcoreUtil.isAncestor(this, newModel))
+      {
+        throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+      }
+      NotificationChain msgs = null;
+      if (eInternalContainer() != null)
+      {
+        msgs = eBasicRemoveFromContainer(msgs);
+      }
+      if (newModel != null)
+      {
+        msgs = ((InternalEObject)newModel).eInverseAdd(this, ModelPackage.MODEL__JV_MS, Model.class, msgs);
+      }
+      msgs = basicSetModel(newModel, msgs);
+      if (msgs != null)
+      {
+        msgs.dispatch();
+      }
+    }
+    else if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.JVM__MODEL, newModel, newModel));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getAboutTextExtra()
+  {
+    return aboutTextExtra;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setAboutTextExtra(String newAboutTextExtra)
+  {
+    String oldAboutTextExtra = aboutTextExtra;
+    aboutTextExtra = newAboutTextExtra;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.JVM__ABOUT_TEXT_EXTRA, oldAboutTextExtra, aboutTextExtra));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.JVM__MODEL:
+        if (eInternalContainer() != null)
+        {
+          msgs = eBasicRemoveFromContainer(msgs);
+        }
+        return basicSetModel((Model)otherEnd, msgs);
+      case ModelPackage.JVM__VARIANTS:
+        return ((InternalEList<InternalEObject>)(InternalEList<?>)getVariants()).basicAdd(otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.JVM__TOUCHPOINTS:
+        return ((InternalEList<?>)getTouchpoints()).basicRemove(otherEnd, msgs);
+      case ModelPackage.JVM__MODEL:
+        return basicSetModel(null, msgs);
+      case ModelPackage.JVM__VARIANTS:
+        return ((InternalEList<?>)getVariants()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
+  {
+    switch (eContainerFeatureID())
+    {
+      case ModelPackage.JVM__MODEL:
+        return eInternalContainer().eInverseRemove(this, ModelPackage.MODEL__JV_MS, Model.class, msgs);
+    }
+    return super.eBasicRemoveFromContainerFeature(msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.JVM__TOUCHPOINTS:
+        return getTouchpoints();
+      case ModelPackage.JVM__NAME:
+        return getName();
+      case ModelPackage.JVM__VERSION:
+        return getVersion();
+      case ModelPackage.JVM__LABEL:
+        return getLabel();
+      case ModelPackage.JVM__MODEL:
+        return getModel();
+      case ModelPackage.JVM__ABOUT_TEXT_EXTRA:
+        return getAboutTextExtra();
+      case ModelPackage.JVM__VARIANTS:
+        return getVariants();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.JVM__TOUCHPOINTS:
+        getTouchpoints().clear();
+        getTouchpoints().addAll((Collection<? extends Touchpoint>)newValue);
+        return;
+      case ModelPackage.JVM__NAME:
+        setName((String)newValue);
+        return;
+      case ModelPackage.JVM__VERSION:
+        setVersion((String)newValue);
+        return;
+      case ModelPackage.JVM__LABEL:
+        setLabel((String)newValue);
+        return;
+      case ModelPackage.JVM__MODEL:
+        setModel((Model)newValue);
+        return;
+      case ModelPackage.JVM__ABOUT_TEXT_EXTRA:
+        setAboutTextExtra((String)newValue);
+        return;
+      case ModelPackage.JVM__VARIANTS:
+        getVariants().clear();
+        getVariants().addAll((Collection<? extends Variant>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.JVM__TOUCHPOINTS:
+        getTouchpoints().clear();
+        return;
+      case ModelPackage.JVM__NAME:
+        setName(NAME_EDEFAULT);
+        return;
+      case ModelPackage.JVM__VERSION:
+        setVersion(VERSION_EDEFAULT);
+        return;
+      case ModelPackage.JVM__LABEL:
+        setLabel(LABEL_EDEFAULT);
+        return;
+      case ModelPackage.JVM__MODEL:
+        setModel((Model)null);
+        return;
+      case ModelPackage.JVM__ABOUT_TEXT_EXTRA:
+        setAboutTextExtra(ABOUT_TEXT_EXTRA_EDEFAULT);
+        return;
+      case ModelPackage.JVM__VARIANTS:
+        getVariants().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.JVM__TOUCHPOINTS:
+        return touchpoints != null && !touchpoints.isEmpty();
+      case ModelPackage.JVM__NAME:
+        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+      case ModelPackage.JVM__VERSION:
+        return VERSION_EDEFAULT == null ? version != null : !VERSION_EDEFAULT.equals(version);
+      case ModelPackage.JVM__LABEL:
+        return LABEL_EDEFAULT == null ? label != null : !LABEL_EDEFAULT.equals(label);
+      case ModelPackage.JVM__MODEL:
+        return getModel() != null;
+      case ModelPackage.JVM__ABOUT_TEXT_EXTRA:
+        return ABOUT_TEXT_EXTRA_EDEFAULT == null ? aboutTextExtra != null : !ABOUT_TEXT_EXTRA_EDEFAULT.equals(aboutTextExtra);
+      case ModelPackage.JVM__VARIANTS:
+        return variants != null && !variants.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass)
+  {
+    if (baseClass == Touchable.class)
+    {
+      switch (derivedFeatureID)
+      {
+        case ModelPackage.JVM__TOUCHPOINTS:
+          return ModelPackage.TOUCHABLE__TOUCHPOINTS;
+        default:
+          return -1;
+      }
+    }
+    return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass)
+  {
+    if (baseClass == Touchable.class)
+    {
+      switch (baseFeatureID)
+      {
+        case ModelPackage.TOUCHABLE__TOUCHPOINTS:
+          return ModelPackage.JVM__TOUCHPOINTS;
+        default:
+          return -1;
+      }
+    }
+    return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy())
+    {
+      return super.toString();
+    }
+
+    StringBuilder result = new StringBuilder(super.toString());
+    result.append(" (name: ");
+    result.append(name);
+    result.append(", version: ");
+    result.append(version);
+    result.append(", label: ");
+    result.append(label);
+    result.append(", aboutTextExtra: ");
+    result.append(aboutTextExtra);
+    result.append(')');
+    return result.toString();
+  }
+
+} //JVMImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelFactoryImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelFactoryImpl.java
new file mode 100644
index 0000000..b2d9fac
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelFactoryImpl.java
@@ -0,0 +1,212 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Phase;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelFactoryImpl extends EFactoryImpl implements ModelFactory
+{
+  /**
+   * Creates the default factory implementation.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public static ModelFactory init()
+  {
+    try
+    {
+      ModelFactory theModelFactory = (ModelFactory)EPackage.Registry.INSTANCE.getEFactory(ModelPackage.eNS_URI);
+      if (theModelFactory != null)
+      {
+        return theModelFactory;
+      }
+    }
+    catch (Exception exception)
+    {
+      EcorePlugin.INSTANCE.log(exception);
+    }
+    return new ModelFactoryImpl();
+  }
+
+  /**
+   * Creates an instance of the factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelFactoryImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EObject create(EClass eClass)
+  {
+    switch (eClass.getClassifierID())
+    {
+      case ModelPackage.MODEL:
+        return createModel();
+      case ModelPackage.JVM:
+        return createJVM();
+      case ModelPackage.VARIANT:
+        return createVariant();
+      case ModelPackage.TOUCHPOINT:
+        return createTouchpoint();
+      default:
+        throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object createFromString(EDataType eDataType, String initialValue)
+  {
+    switch (eDataType.getClassifierID())
+    {
+      case ModelPackage.PHASE:
+        return createPhaseFromString(eDataType, initialValue);
+      default:
+        throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String convertToString(EDataType eDataType, Object instanceValue)
+  {
+    switch (eDataType.getClassifierID())
+    {
+      case ModelPackage.PHASE:
+        return convertPhaseToString(eDataType, instanceValue);
+      default:
+        throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Model createModel()
+  {
+    ModelImpl model = new ModelImpl();
+    return model;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public JVM createJVM()
+  {
+    JVMImpl jvm = new JVMImpl();
+    return jvm;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Variant createVariant()
+  {
+    VariantImpl variant = new VariantImpl();
+    return variant;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Touchpoint createTouchpoint()
+  {
+    TouchpointImpl touchpoint = new TouchpointImpl();
+    return touchpoint;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public Phase createPhaseFromString(EDataType eDataType, String initialValue)
+  {
+    Phase result = Phase.get(initialValue);
+    if (result == null)
+    {
+      throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+    }
+    return result;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public String convertPhaseToString(EDataType eDataType, Object instanceValue)
+  {
+    return instanceValue == null ? null : instanceValue.toString();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ModelPackage getModelPackage()
+  {
+    return (ModelPackage)getEPackage();
+  }
+
+} //ModelFactoryImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelImpl.java
new file mode 100644
index 0000000..7b3183a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelImpl.java
@@ -0,0 +1,834 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Model</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getTouchpoints <em>Touchpoints</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getProvider <em>Provider</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getProviderImageName <em>Provider Image Name</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getProviderImageData <em>Provider Image Data</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getAboutURL <em>About URL</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getTarget <em>Target</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getSource <em>Source</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getLocalCache <em>Local Cache</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.ModelImpl#getJVMs <em>JV Ms</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModelImpl extends CopyrightableImpl implements Model
+{
+  /**
+   * The cached value of the '{@link #getTouchpoints() <em>Touchpoints</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTouchpoints()
+   * @generated
+   * @ordered
+   */
+  protected EList<Touchpoint> touchpoints;
+
+  /**
+   * 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 #getLabel() <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLabel()
+   * @generated
+   * @ordered
+   */
+  protected static final String LABEL_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLabel()
+   * @generated
+   * @ordered
+   */
+  protected String label = LABEL_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getProvider() <em>Provider</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getProvider()
+   * @generated
+   * @ordered
+   */
+  protected static final String PROVIDER_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getProvider() <em>Provider</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getProvider()
+   * @generated
+   * @ordered
+   */
+  protected String provider = PROVIDER_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getProviderImageName() <em>Provider Image Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getProviderImageName()
+   * @generated
+   * @ordered
+   */
+  protected static final String PROVIDER_IMAGE_NAME_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getProviderImageName() <em>Provider Image Name</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getProviderImageName()
+   * @generated
+   * @ordered
+   */
+  protected String providerImageName = PROVIDER_IMAGE_NAME_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getProviderImageData() <em>Provider Image Data</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getProviderImageData()
+   * @generated
+   * @ordered
+   */
+  protected static final byte[] PROVIDER_IMAGE_DATA_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getProviderImageData() <em>Provider Image Data</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getProviderImageData()
+   * @generated
+   * @ordered
+   */
+  protected byte[] providerImageData = PROVIDER_IMAGE_DATA_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getAboutURL() <em>About URL</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getAboutURL()
+   * @generated
+   * @ordered
+   */
+  protected static final String ABOUT_URL_EDEFAULT = "https://www.eclipse.org/legal/epl/epl-2.0/about.html";
+
+  /**
+   * The cached value of the '{@link #getAboutURL() <em>About URL</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getAboutURL()
+   * @generated
+   * @ordered
+   */
+  protected String aboutURL = ABOUT_URL_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getTarget() <em>Target</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTarget()
+   * @generated
+   * @ordered
+   */
+  protected static final String TARGET_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getTarget() <em>Target</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTarget()
+   * @generated
+   * @ordered
+   */
+  protected String target = TARGET_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getSource() <em>Source</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getSource()
+   * @generated
+   * @ordered
+   */
+  protected static final String SOURCE_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getSource() <em>Source</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getSource()
+   * @generated
+   * @ordered
+   */
+  protected String source = SOURCE_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getLocalCache() <em>Local Cache</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLocalCache()
+   * @generated
+   * @ordered
+   */
+  protected static final String LOCAL_CACHE_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getLocalCache() <em>Local Cache</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLocalCache()
+   * @generated
+   * @ordered
+   */
+  protected String localCache = LOCAL_CACHE_EDEFAULT;
+
+  /**
+   * The cached value of the '{@link #getJVMs() <em>JV Ms</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getJVMs()
+   * @generated
+   * @ordered
+   */
+  protected EList<JVM> jVMs;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ModelPackage.Literals.MODEL;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EList<Touchpoint> getTouchpoints()
+  {
+    if (touchpoints == null)
+    {
+      touchpoints = new EObjectContainmentEList<Touchpoint>(Touchpoint.class, this, ModelPackage.MODEL__TOUCHPOINTS);
+    }
+    return touchpoints;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getName()
+  {
+    return name;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setName(String newName)
+  {
+    String oldName = name;
+    name = newName;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__NAME, oldName, name));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getLabel()
+  {
+    return label;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setLabel(String newLabel)
+  {
+    String oldLabel = label;
+    label = newLabel;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__LABEL, oldLabel, label));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EList<JVM> getJVMs()
+  {
+    if (jVMs == null)
+    {
+      jVMs = new EObjectContainmentWithInverseEList<JVM>(JVM.class, this, ModelPackage.MODEL__JV_MS, ModelPackage.JVM__MODEL);
+    }
+    return jVMs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getProvider()
+  {
+    return provider;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setProvider(String newProvider)
+  {
+    String oldProvider = provider;
+    provider = newProvider;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__PROVIDER, oldProvider, provider));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getProviderImageName()
+  {
+    return providerImageName;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setProviderImageName(String newProviderImageName)
+  {
+    String oldProviderImageName = providerImageName;
+    providerImageName = newProviderImageName;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__PROVIDER_IMAGE_NAME, oldProviderImageName, providerImageName));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public byte[] getProviderImageData()
+  {
+    return providerImageData;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setProviderImageData(byte[] newProviderImageData)
+  {
+    byte[] oldProviderImageData = providerImageData;
+    providerImageData = newProviderImageData;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__PROVIDER_IMAGE_DATA, oldProviderImageData, providerImageData));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getAboutURL()
+  {
+    return aboutURL;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setAboutURL(String newAboutURL)
+  {
+    String oldAboutURL = aboutURL;
+    aboutURL = newAboutURL;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__ABOUT_URL, oldAboutURL, aboutURL));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getTarget()
+  {
+    return target;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setTarget(String newTarget)
+  {
+    String oldTarget = target;
+    target = newTarget;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__TARGET, oldTarget, target));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getSource()
+  {
+    return source;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setSource(String newSource)
+  {
+    String oldSource = source;
+    source = newSource;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__SOURCE, oldSource, source));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getLocalCache()
+  {
+    return localCache;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setLocalCache(String newLocalCache)
+  {
+    String oldLocalCache = localCache;
+    localCache = newLocalCache;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODEL__LOCAL_CACHE, oldLocalCache, localCache));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.MODEL__JV_MS:
+        return ((InternalEList<InternalEObject>)(InternalEList<?>)getJVMs()).basicAdd(otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.MODEL__TOUCHPOINTS:
+        return ((InternalEList<?>)getTouchpoints()).basicRemove(otherEnd, msgs);
+      case ModelPackage.MODEL__JV_MS:
+        return ((InternalEList<?>)getJVMs()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.MODEL__TOUCHPOINTS:
+        return getTouchpoints();
+      case ModelPackage.MODEL__NAME:
+        return getName();
+      case ModelPackage.MODEL__LABEL:
+        return getLabel();
+      case ModelPackage.MODEL__PROVIDER:
+        return getProvider();
+      case ModelPackage.MODEL__PROVIDER_IMAGE_NAME:
+        return getProviderImageName();
+      case ModelPackage.MODEL__PROVIDER_IMAGE_DATA:
+        return getProviderImageData();
+      case ModelPackage.MODEL__ABOUT_URL:
+        return getAboutURL();
+      case ModelPackage.MODEL__TARGET:
+        return getTarget();
+      case ModelPackage.MODEL__SOURCE:
+        return getSource();
+      case ModelPackage.MODEL__LOCAL_CACHE:
+        return getLocalCache();
+      case ModelPackage.MODEL__JV_MS:
+        return getJVMs();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.MODEL__TOUCHPOINTS:
+        getTouchpoints().clear();
+        getTouchpoints().addAll((Collection<? extends Touchpoint>)newValue);
+        return;
+      case ModelPackage.MODEL__NAME:
+        setName((String)newValue);
+        return;
+      case ModelPackage.MODEL__LABEL:
+        setLabel((String)newValue);
+        return;
+      case ModelPackage.MODEL__PROVIDER:
+        setProvider((String)newValue);
+        return;
+      case ModelPackage.MODEL__PROVIDER_IMAGE_NAME:
+        setProviderImageName((String)newValue);
+        return;
+      case ModelPackage.MODEL__PROVIDER_IMAGE_DATA:
+        setProviderImageData((byte[])newValue);
+        return;
+      case ModelPackage.MODEL__ABOUT_URL:
+        setAboutURL((String)newValue);
+        return;
+      case ModelPackage.MODEL__TARGET:
+        setTarget((String)newValue);
+        return;
+      case ModelPackage.MODEL__SOURCE:
+        setSource((String)newValue);
+        return;
+      case ModelPackage.MODEL__LOCAL_CACHE:
+        setLocalCache((String)newValue);
+        return;
+      case ModelPackage.MODEL__JV_MS:
+        getJVMs().clear();
+        getJVMs().addAll((Collection<? extends JVM>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.MODEL__TOUCHPOINTS:
+        getTouchpoints().clear();
+        return;
+      case ModelPackage.MODEL__NAME:
+        setName(NAME_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__LABEL:
+        setLabel(LABEL_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__PROVIDER:
+        setProvider(PROVIDER_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__PROVIDER_IMAGE_NAME:
+        setProviderImageName(PROVIDER_IMAGE_NAME_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__PROVIDER_IMAGE_DATA:
+        setProviderImageData(PROVIDER_IMAGE_DATA_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__ABOUT_URL:
+        setAboutURL(ABOUT_URL_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__TARGET:
+        setTarget(TARGET_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__SOURCE:
+        setSource(SOURCE_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__LOCAL_CACHE:
+        setLocalCache(LOCAL_CACHE_EDEFAULT);
+        return;
+      case ModelPackage.MODEL__JV_MS:
+        getJVMs().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("null")
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.MODEL__TOUCHPOINTS:
+        return touchpoints != null && !touchpoints.isEmpty();
+      case ModelPackage.MODEL__NAME:
+        return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+      case ModelPackage.MODEL__LABEL:
+        return LABEL_EDEFAULT == null ? label != null : !LABEL_EDEFAULT.equals(label);
+      case ModelPackage.MODEL__PROVIDER:
+        return PROVIDER_EDEFAULT == null ? provider != null : !PROVIDER_EDEFAULT.equals(provider);
+      case ModelPackage.MODEL__PROVIDER_IMAGE_NAME:
+        return PROVIDER_IMAGE_NAME_EDEFAULT == null ? providerImageName != null : !PROVIDER_IMAGE_NAME_EDEFAULT.equals(providerImageName);
+      case ModelPackage.MODEL__PROVIDER_IMAGE_DATA:
+        return PROVIDER_IMAGE_DATA_EDEFAULT == null ? providerImageData != null : !PROVIDER_IMAGE_DATA_EDEFAULT.equals(providerImageData);
+      case ModelPackage.MODEL__ABOUT_URL:
+        return ABOUT_URL_EDEFAULT == null ? aboutURL != null : !ABOUT_URL_EDEFAULT.equals(aboutURL);
+      case ModelPackage.MODEL__TARGET:
+        return TARGET_EDEFAULT == null ? target != null : !TARGET_EDEFAULT.equals(target);
+      case ModelPackage.MODEL__SOURCE:
+        return SOURCE_EDEFAULT == null ? source != null : !SOURCE_EDEFAULT.equals(source);
+      case ModelPackage.MODEL__LOCAL_CACHE:
+        return LOCAL_CACHE_EDEFAULT == null ? localCache != null : !LOCAL_CACHE_EDEFAULT.equals(localCache);
+      case ModelPackage.MODEL__JV_MS:
+        return jVMs != null && !jVMs.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass)
+  {
+    if (baseClass == Touchable.class)
+    {
+      switch (derivedFeatureID)
+      {
+        case ModelPackage.MODEL__TOUCHPOINTS:
+          return ModelPackage.TOUCHABLE__TOUCHPOINTS;
+        default:
+          return -1;
+      }
+    }
+    return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass)
+  {
+    if (baseClass == Touchable.class)
+    {
+      switch (baseFeatureID)
+      {
+        case ModelPackage.TOUCHABLE__TOUCHPOINTS:
+          return ModelPackage.MODEL__TOUCHPOINTS;
+        default:
+          return -1;
+      }
+    }
+    return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy())
+    {
+      return super.toString();
+    }
+
+    StringBuilder result = new StringBuilder(super.toString());
+    result.append(" (name: ");
+    result.append(name);
+    result.append(", label: ");
+    result.append(label);
+    result.append(", provider: ");
+    result.append(provider);
+    result.append(", providerImageName: ");
+    result.append(providerImageName);
+    result.append(", providerImageData: ");
+    result.append(providerImageData);
+    result.append(", aboutURL: ");
+    result.append(aboutURL);
+    result.append(", target: ");
+    result.append(target);
+    result.append(", source: ");
+    result.append(source);
+    result.append(", localCache: ");
+    result.append(localCache);
+    result.append(')');
+    return result.toString();
+  }
+
+} //ModelImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelPackageImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelPackageImpl.java
new file mode 100644
index 0000000..5c52f9a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/ModelPackageImpl.java
@@ -0,0 +1,1156 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Phase;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelPackageImpl extends EPackageImpl implements ModelPackage
+{
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass modelEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass jvmEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass variantEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass copyrightableEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass touchpointEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EClass touchableEClass = null;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private EEnum phaseEEnum = null;
+
+  /**
+   * Creates an instance of the model <b>Package</b>, registered with
+   * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+   * package URI value.
+   * <p>Note: the correct way to create the package is via the static
+   * factory method {@link #init init()}, which also performs
+   * initialization of the package, or returns the registered package,
+   * if one already exists.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see org.eclipse.emf.ecore.EPackage.Registry
+   * @see org.eclipse.justj.codegen.model.ModelPackage#eNS_URI
+   * @see #init()
+   * @generated
+   */
+  private ModelPackageImpl()
+  {
+    super(eNS_URI, ModelFactory.eINSTANCE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private static boolean isInited = false;
+
+  /**
+   * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+   *
+   * <p>This method is used to initialize {@link ModelPackage#eINSTANCE} when that field is accessed.
+   * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #eNS_URI
+   * @see #createPackageContents()
+   * @see #initializePackageContents()
+   * @generated
+   */
+  public static ModelPackage init()
+  {
+    if (isInited)
+    {
+      return (ModelPackage)EPackage.Registry.INSTANCE.getEPackage(ModelPackage.eNS_URI);
+    }
+
+    // Obtain or create and register package
+    Object registeredModelPackage = EPackage.Registry.INSTANCE.get(eNS_URI);
+    ModelPackageImpl theModelPackage = registeredModelPackage instanceof ModelPackageImpl ? (ModelPackageImpl)registeredModelPackage : new ModelPackageImpl();
+
+    isInited = true;
+
+    // Initialize simple dependencies
+    XMLTypePackage.eINSTANCE.eClass();
+
+    // Create package meta-data objects
+    theModelPackage.createPackageContents();
+
+    // Initialize created meta-data
+    theModelPackage.initializePackageContents();
+
+    // Mark meta-data to indicate it can't be changed
+    theModelPackage.freeze();
+
+    // Update the registry and return the package
+    EPackage.Registry.INSTANCE.put(ModelPackage.eNS_URI, theModelPackage);
+    return theModelPackage;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EClass getModel()
+  {
+    return modelEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_Name()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_Label()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EReference getModel_JVMs()
+  {
+    return (EReference)modelEClass.getEStructuralFeatures().get(9);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_Provider()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_ProviderImageName()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_ProviderImageData()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_AboutURL()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_Target()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(6);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_Source()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(7);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getModel_LocalCache()
+  {
+    return (EAttribute)modelEClass.getEStructuralFeatures().get(8);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EClass getJVM()
+  {
+    return jvmEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getJVM_Name()
+  {
+    return (EAttribute)jvmEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getJVM_Version()
+  {
+    return (EAttribute)jvmEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getJVM_Label()
+  {
+    return (EAttribute)jvmEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EReference getJVM_Variants()
+  {
+    return (EReference)jvmEClass.getEStructuralFeatures().get(5);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EReference getJVM_Model()
+  {
+    return (EReference)jvmEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getJVM_AboutTextExtra()
+  {
+    return (EAttribute)jvmEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EClass getVariant()
+  {
+    return variantEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getVariant_Os()
+  {
+    return (EAttribute)variantEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getVariant_Arch()
+  {
+    return (EAttribute)variantEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EReference getVariant_JVM()
+  {
+    return (EReference)variantEClass.getEStructuralFeatures().get(4);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getVariant_Label()
+  {
+    return (EAttribute)variantEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getVariant_Source()
+  {
+    return (EAttribute)variantEClass.getEStructuralFeatures().get(3);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EClass getCopyrightable()
+  {
+    return copyrightableEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getCopyrightable_CopyrightHolder()
+  {
+    return (EAttribute)copyrightableEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getCopyrightable_CopyrightYear()
+  {
+    return (EAttribute)copyrightableEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getCopyrightable_CopyrightText()
+  {
+    return (EAttribute)copyrightableEClass.getEStructuralFeatures().get(2);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EClass getTouchpoint()
+  {
+    return touchpointEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getTouchpoint_Phase()
+  {
+    return (EAttribute)touchpointEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EAttribute getTouchpoint_Instructions()
+  {
+    return (EAttribute)touchpointEClass.getEStructuralFeatures().get(1);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EClass getTouchable()
+  {
+    return touchableEClass;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EReference getTouchable_Touchpoints()
+  {
+    return (EReference)touchableEClass.getEStructuralFeatures().get(0);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EEnum getPhase()
+  {
+    return phaseEEnum;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public ModelFactory getModelFactory()
+  {
+    return (ModelFactory)getEFactoryInstance();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private boolean isCreated = false;
+
+  /**
+   * Creates the meta-model objects for the package.  This method is
+   * guarded to have no affect on any invocation but its first.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void createPackageContents()
+  {
+    if (isCreated)
+    {
+      return;
+    }
+    isCreated = true;
+
+    // Create classes and their features
+    modelEClass = createEClass(MODEL);
+    createEAttribute(modelEClass, MODEL__NAME);
+    createEAttribute(modelEClass, MODEL__LABEL);
+    createEAttribute(modelEClass, MODEL__PROVIDER);
+    createEAttribute(modelEClass, MODEL__PROVIDER_IMAGE_NAME);
+    createEAttribute(modelEClass, MODEL__PROVIDER_IMAGE_DATA);
+    createEAttribute(modelEClass, MODEL__ABOUT_URL);
+    createEAttribute(modelEClass, MODEL__TARGET);
+    createEAttribute(modelEClass, MODEL__SOURCE);
+    createEAttribute(modelEClass, MODEL__LOCAL_CACHE);
+    createEReference(modelEClass, MODEL__JV_MS);
+
+    jvmEClass = createEClass(JVM);
+    createEAttribute(jvmEClass, JVM__NAME);
+    createEAttribute(jvmEClass, JVM__VERSION);
+    createEAttribute(jvmEClass, JVM__LABEL);
+    createEReference(jvmEClass, JVM__MODEL);
+    createEAttribute(jvmEClass, JVM__ABOUT_TEXT_EXTRA);
+    createEReference(jvmEClass, JVM__VARIANTS);
+
+    variantEClass = createEClass(VARIANT);
+    createEAttribute(variantEClass, VARIANT__OS);
+    createEAttribute(variantEClass, VARIANT__ARCH);
+    createEAttribute(variantEClass, VARIANT__LABEL);
+    createEAttribute(variantEClass, VARIANT__SOURCE);
+    createEReference(variantEClass, VARIANT__JVM);
+
+    copyrightableEClass = createEClass(COPYRIGHTABLE);
+    createEAttribute(copyrightableEClass, COPYRIGHTABLE__COPYRIGHT_HOLDER);
+    createEAttribute(copyrightableEClass, COPYRIGHTABLE__COPYRIGHT_YEAR);
+    createEAttribute(copyrightableEClass, COPYRIGHTABLE__COPYRIGHT_TEXT);
+
+    touchpointEClass = createEClass(TOUCHPOINT);
+    createEAttribute(touchpointEClass, TOUCHPOINT__PHASE);
+    createEAttribute(touchpointEClass, TOUCHPOINT__INSTRUCTIONS);
+
+    touchableEClass = createEClass(TOUCHABLE);
+    createEReference(touchableEClass, TOUCHABLE__TOUCHPOINTS);
+
+    // Create enums
+    phaseEEnum = createEEnum(PHASE);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  private boolean isInitialized = false;
+
+  /**
+   * Complete the initialization of the package and its meta-model.  This
+   * method is guarded to have no affect on any invocation but its first.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void initializePackageContents()
+  {
+    if (isInitialized)
+    {
+      return;
+    }
+    isInitialized = true;
+
+    // Initialize package
+    setName(eNAME);
+    setNsPrefix(eNS_PREFIX);
+    setNsURI(eNS_URI);
+
+    // Obtain other dependent packages
+    XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
+
+    // Create type parameters
+
+    // Set bounds for type parameters
+
+    // Add supertypes to classes
+    modelEClass.getESuperTypes().add(this.getCopyrightable());
+    modelEClass.getESuperTypes().add(this.getTouchable());
+    jvmEClass.getESuperTypes().add(this.getCopyrightable());
+    jvmEClass.getESuperTypes().add(this.getTouchable());
+    variantEClass.getESuperTypes().add(this.getCopyrightable());
+    variantEClass.getESuperTypes().add(this.getTouchable());
+
+    // Initialize classes, features, and operations; add parameters
+    initEClass(modelEClass, Model.class, "Model", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(
+      getModel_Name(),
+      ecorePackage.getEString(),
+      "name",
+      null,
+      1,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_Label(),
+      ecorePackage.getEString(),
+      "label",
+      null,
+      1,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_Provider(),
+      ecorePackage.getEString(),
+      "provider",
+      null,
+      1,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_ProviderImageName(),
+      ecorePackage.getEString(),
+      "providerImageName",
+      null,
+      1,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_ProviderImageData(),
+      theXMLTypePackage.getBase64Binary(),
+      "providerImageData",
+      null,
+      1,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_AboutURL(),
+      ecorePackage.getEString(),
+      "aboutURL",
+      "https://www.eclipse.org/legal/epl/epl-2.0/about.html",
+      0,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_Target(),
+      ecorePackage.getEString(),
+      "target",
+      null,
+      1,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_Source(),
+      ecorePackage.getEString(),
+      "source",
+      null,
+      0,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getModel_LocalCache(),
+      ecorePackage.getEString(),
+      "localCache",
+      null,
+      0,
+      1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEReference(
+      getModel_JVMs(),
+      this.getJVM(),
+      this.getJVM_Model(),
+      "jVMs",
+      null,
+      1,
+      -1,
+      Model.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      IS_COMPOSITE,
+      !IS_RESOLVE_PROXIES,
+      !IS_UNSETTABLE,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+
+    initEClass(jvmEClass, org.eclipse.justj.codegen.model.JVM.class, "JVM", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(
+      getJVM_Name(),
+      ecorePackage.getEString(),
+      "name",
+      null,
+      1,
+      1,
+      org.eclipse.justj.codegen.model.JVM.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getJVM_Version(),
+      ecorePackage.getEString(),
+      "version",
+      null,
+      1,
+      1,
+      org.eclipse.justj.codegen.model.JVM.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getJVM_Label(),
+      ecorePackage.getEString(),
+      "label",
+      null,
+      1,
+      1,
+      org.eclipse.justj.codegen.model.JVM.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEReference(
+      getJVM_Model(),
+      this.getModel(),
+      this.getModel_JVMs(),
+      "model",
+      null,
+      0,
+      1,
+      org.eclipse.justj.codegen.model.JVM.class,
+      IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_COMPOSITE,
+      !IS_RESOLVE_PROXIES,
+      !IS_UNSETTABLE,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getJVM_AboutTextExtra(),
+      ecorePackage.getEString(),
+      "aboutTextExtra",
+      null,
+      0,
+      1,
+      org.eclipse.justj.codegen.model.JVM.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEReference(
+      getJVM_Variants(),
+      this.getVariant(),
+      this.getVariant_JVM(),
+      "variants",
+      null,
+      1,
+      -1,
+      org.eclipse.justj.codegen.model.JVM.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      IS_COMPOSITE,
+      !IS_RESOLVE_PROXIES,
+      !IS_UNSETTABLE,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+
+    initEClass(variantEClass, Variant.class, "Variant", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(
+      getVariant_Os(),
+      ecorePackage.getEString(),
+      "os",
+      null,
+      1,
+      1,
+      Variant.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getVariant_Arch(),
+      ecorePackage.getEString(),
+      "arch",
+      null,
+      1,
+      1,
+      Variant.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getVariant_Label(),
+      ecorePackage.getEString(),
+      "label",
+      null,
+      1,
+      1,
+      Variant.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getVariant_Source(),
+      theXMLTypePackage.getString(),
+      "source",
+      null,
+      0,
+      1,
+      Variant.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEReference(
+      getVariant_JVM(),
+      this.getJVM(),
+      this.getJVM_Variants(),
+      "jVM",
+      null,
+      0,
+      1,
+      Variant.class,
+      IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_COMPOSITE,
+      !IS_RESOLVE_PROXIES,
+      !IS_UNSETTABLE,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+
+    initEClass(copyrightableEClass, Copyrightable.class, "Copyrightable", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(
+      getCopyrightable_CopyrightHolder(),
+      ecorePackage.getEString(),
+      "copyrightHolder",
+      null,
+      0,
+      1,
+      Copyrightable.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getCopyrightable_CopyrightYear(),
+      ecorePackage.getEString(),
+      "copyrightYear",
+      null,
+      0,
+      1,
+      Copyrightable.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getCopyrightable_CopyrightText(),
+      ecorePackage.getEString(),
+      "copyrightText",
+      null,
+      0,
+      1,
+      Copyrightable.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+
+    initEClass(touchpointEClass, Touchpoint.class, "Touchpoint", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEAttribute(
+      getTouchpoint_Phase(),
+      this.getPhase(),
+      "phase",
+      null,
+      0,
+      1,
+      Touchpoint.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+    initEAttribute(
+      getTouchpoint_Instructions(),
+      ecorePackage.getEString(),
+      "instructions",
+      null,
+      1,
+      -1,
+      Touchpoint.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      !IS_UNSETTABLE,
+      !IS_ID,
+      !IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+
+    initEClass(touchableEClass, Touchable.class, "Touchable", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+    initEReference(
+      getTouchable_Touchpoints(),
+      this.getTouchpoint(),
+      null,
+      "touchpoints",
+      null,
+      0,
+      -1,
+      Touchable.class,
+      !IS_TRANSIENT,
+      !IS_VOLATILE,
+      IS_CHANGEABLE,
+      IS_COMPOSITE,
+      !IS_RESOLVE_PROXIES,
+      !IS_UNSETTABLE,
+      IS_UNIQUE,
+      !IS_DERIVED,
+      IS_ORDERED);
+
+    // Initialize enums and add enum literals
+    initEEnum(phaseEEnum, Phase.class, "Phase");
+    addEEnumLiteral(phaseEEnum, Phase.INSTALL);
+    addEEnumLiteral(phaseEEnum, Phase.UNINSTALL);
+
+    // Create resource
+    createResource(eNS_URI);
+
+    // Create annotations
+    // http://www.eclipse.org/emf/2002/GenModel
+    createGenModelAnnotations();
+    // http:///org/eclipse/emf/ecore/util/ExtendedMetaData
+    createExtendedMetaDataAnnotations();
+  }
+
+  /**
+   * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/GenModel</b>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected void createGenModelAnnotations()
+  {
+    String source = "http://www.eclipse.org/emf/2002/GenModel";
+    addAnnotation(
+      this,
+      source,
+      new String []{
+        "copyrightText",
+        "Copyright (c) 2020 Eclipse contributors and others.\n\nThis program and the accompanying materials\nare made available under the terms of the Eclipse Public License 2.0\nwhich accompanies this distribution, and is available at\nhttps://www.eclipse.org/legal/epl-2.0/\n\nSPDX-License-Identifier: EPL-2.0" });
+    addAnnotation(getJVM_AboutTextExtra(), source, new String []{ "propertyMultiLine", "true" });
+    addAnnotation(getCopyrightable_CopyrightText(), source, new String []{ "propertyMultiLine", "true" });
+  }
+
+  /**
+   * 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(getModel_JVMs(), source, new String []{ "name", "jvm", "kind", "element" });
+    addAnnotation(getJVM_AboutTextExtra(), source, new String []{ "kind", "element" });
+    addAnnotation(getJVM_Variants(), source, new String []{ "name", "variant", "kind", "element" });
+    addAnnotation(getVariant_JVM(), source, new String []{ "name", "jvm", "kind", "element" });
+    addAnnotation(getCopyrightable_CopyrightText(), source, new String []{ "kind", "element" });
+    addAnnotation(getTouchpoint_Instructions(), source, new String []{ "kind", "element", "name", "instruction" });
+  }
+
+} //ModelPackageImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/TouchpointImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/TouchpointImpl.java
new file mode 100644
index 0000000..8a987c5
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/TouchpointImpl.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EDataTypeEList;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Phase;
+import org.eclipse.justj.codegen.model.Touchpoint;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Touchpoint</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.TouchpointImpl#getPhase <em>Phase</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.TouchpointImpl#getInstructions <em>Instructions</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TouchpointImpl extends MinimalEObjectImpl.Container implements Touchpoint
+{
+  /**
+   * The default value of the '{@link #getPhase() <em>Phase</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getPhase()
+   * @generated
+   * @ordered
+   */
+  protected static final Phase PHASE_EDEFAULT = Phase.INSTALL;
+
+  /**
+   * The cached value of the '{@link #getPhase() <em>Phase</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getPhase()
+   * @generated
+   * @ordered
+   */
+  protected Phase phase = PHASE_EDEFAULT;
+
+  /**
+   * The cached value of the '{@link #getInstructions() <em>Instructions</em>}' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getInstructions()
+   * @generated
+   * @ordered
+   */
+  protected EList<String> instructions;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected TouchpointImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ModelPackage.Literals.TOUCHPOINT;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Phase getPhase()
+  {
+    return phase;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setPhase(Phase newPhase)
+  {
+    Phase oldPhase = phase;
+    phase = newPhase == null ? PHASE_EDEFAULT : newPhase;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TOUCHPOINT__PHASE, oldPhase, phase));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EList<String> getInstructions()
+  {
+    if (instructions == null)
+    {
+      instructions = new EDataTypeEList<String>(String.class, this, ModelPackage.TOUCHPOINT__INSTRUCTIONS);
+    }
+    return instructions;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.TOUCHPOINT__PHASE:
+        return getPhase();
+      case ModelPackage.TOUCHPOINT__INSTRUCTIONS:
+        return getInstructions();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.TOUCHPOINT__PHASE:
+        setPhase((Phase)newValue);
+        return;
+      case ModelPackage.TOUCHPOINT__INSTRUCTIONS:
+        getInstructions().clear();
+        getInstructions().addAll((Collection<? extends String>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.TOUCHPOINT__PHASE:
+        setPhase(PHASE_EDEFAULT);
+        return;
+      case ModelPackage.TOUCHPOINT__INSTRUCTIONS:
+        getInstructions().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.TOUCHPOINT__PHASE:
+        return phase != PHASE_EDEFAULT;
+      case ModelPackage.TOUCHPOINT__INSTRUCTIONS:
+        return instructions != null && !instructions.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy())
+    {
+      return super.toString();
+    }
+
+    StringBuilder result = new StringBuilder(super.toString());
+    result.append(" (phase: ");
+    result.append(phase);
+    result.append(", instructions: ");
+    result.append(instructions);
+    result.append(')');
+    return result.toString();
+  }
+
+} //TouchpointImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/VariantImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/VariantImpl.java
new file mode 100644
index 0000000..af27ec9
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/impl/VariantImpl.java
@@ -0,0 +1,587 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.impl;
+
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Variant</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.VariantImpl#getTouchpoints <em>Touchpoints</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.VariantImpl#getOs <em>Os</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.VariantImpl#getArch <em>Arch</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.VariantImpl#getLabel <em>Label</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.VariantImpl#getSource <em>Source</em>}</li>
+ *   <li>{@link org.eclipse.justj.codegen.model.impl.VariantImpl#getJVM <em>JVM</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class VariantImpl extends CopyrightableImpl implements Variant
+{
+  /**
+   * The cached value of the '{@link #getTouchpoints() <em>Touchpoints</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getTouchpoints()
+   * @generated
+   * @ordered
+   */
+  protected EList<Touchpoint> touchpoints;
+
+  /**
+   * The default value of the '{@link #getOs() <em>Os</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getOs()
+   * @generated
+   * @ordered
+   */
+  protected static final String OS_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getOs() <em>Os</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getOs()
+   * @generated
+   * @ordered
+   */
+  protected String os = OS_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getArch() <em>Arch</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getArch()
+   * @generated
+   * @ordered
+   */
+  protected static final String ARCH_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getArch() <em>Arch</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getArch()
+   * @generated
+   * @ordered
+   */
+  protected String arch = ARCH_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getLabel() <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLabel()
+   * @generated
+   * @ordered
+   */
+  protected static final String LABEL_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getLabel() <em>Label</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLabel()
+   * @generated
+   * @ordered
+   */
+  protected String label = LABEL_EDEFAULT;
+
+  /**
+   * The default value of the '{@link #getSource() <em>Source</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getSource()
+   * @generated
+   * @ordered
+   */
+  protected static final String SOURCE_EDEFAULT = null;
+
+  /**
+   * The cached value of the '{@link #getSource() <em>Source</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getSource()
+   * @generated
+   * @ordered
+   */
+  protected String source = SOURCE_EDEFAULT;
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected VariantImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return ModelPackage.Literals.VARIANT;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public EList<Touchpoint> getTouchpoints()
+  {
+    if (touchpoints == null)
+    {
+      touchpoints = new EObjectContainmentEList<Touchpoint>(Touchpoint.class, this, ModelPackage.VARIANT__TOUCHPOINTS);
+    }
+    return touchpoints;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getOs()
+  {
+    return os;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setOs(String newOs)
+  {
+    String oldOs = os;
+    os = newOs;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.VARIANT__OS, oldOs, os));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getArch()
+  {
+    return arch;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setArch(String newArch)
+  {
+    String oldArch = arch;
+    arch = newArch;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.VARIANT__ARCH, oldArch, arch));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public JVM getJVM()
+  {
+    if (eContainerFeatureID() != ModelPackage.VARIANT__JVM)
+    {
+      return null;
+    }
+    return (JVM)eInternalContainer();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public NotificationChain basicSetJVM(JVM newJVM, NotificationChain msgs)
+  {
+    msgs = eBasicSetContainer((InternalEObject)newJVM, ModelPackage.VARIANT__JVM, msgs);
+    return msgs;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setJVM(JVM newJVM)
+  {
+    if (newJVM != eInternalContainer() || (eContainerFeatureID() != ModelPackage.VARIANT__JVM && newJVM != null))
+    {
+      if (EcoreUtil.isAncestor(this, newJVM))
+      {
+        throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+      }
+      NotificationChain msgs = null;
+      if (eInternalContainer() != null)
+      {
+        msgs = eBasicRemoveFromContainer(msgs);
+      }
+      if (newJVM != null)
+      {
+        msgs = ((InternalEObject)newJVM).eInverseAdd(this, ModelPackage.JVM__VARIANTS, JVM.class, msgs);
+      }
+      msgs = basicSetJVM(newJVM, msgs);
+      if (msgs != null)
+      {
+        msgs.dispatch();
+      }
+    }
+    else if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.VARIANT__JVM, newJVM, newJVM));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getLabel()
+  {
+    return label;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setLabel(String newLabel)
+  {
+    String oldLabel = label;
+    label = newLabel;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.VARIANT__LABEL, oldLabel, label));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String getSource()
+  {
+    return source;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void setSource(String newSource)
+  {
+    String oldSource = source;
+    source = newSource;
+    if (eNotificationRequired())
+    {
+      eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.VARIANT__SOURCE, oldSource, source));
+    }
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.VARIANT__JVM:
+        if (eInternalContainer() != null)
+        {
+          msgs = eBasicRemoveFromContainer(msgs);
+        }
+        return basicSetJVM((JVM)otherEnd, msgs);
+    }
+    return super.eInverseAdd(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.VARIANT__TOUCHPOINTS:
+        return ((InternalEList<?>)getTouchpoints()).basicRemove(otherEnd, msgs);
+      case ModelPackage.VARIANT__JVM:
+        return basicSetJVM(null, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs)
+  {
+    switch (eContainerFeatureID())
+    {
+      case ModelPackage.VARIANT__JVM:
+        return eInternalContainer().eInverseRemove(this, ModelPackage.JVM__VARIANTS, JVM.class, msgs);
+    }
+    return super.eBasicRemoveFromContainerFeature(msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.VARIANT__TOUCHPOINTS:
+        return getTouchpoints();
+      case ModelPackage.VARIANT__OS:
+        return getOs();
+      case ModelPackage.VARIANT__ARCH:
+        return getArch();
+      case ModelPackage.VARIANT__LABEL:
+        return getLabel();
+      case ModelPackage.VARIANT__SOURCE:
+        return getSource();
+      case ModelPackage.VARIANT__JVM:
+        return getJVM();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.VARIANT__TOUCHPOINTS:
+        getTouchpoints().clear();
+        getTouchpoints().addAll((Collection<? extends Touchpoint>)newValue);
+        return;
+      case ModelPackage.VARIANT__OS:
+        setOs((String)newValue);
+        return;
+      case ModelPackage.VARIANT__ARCH:
+        setArch((String)newValue);
+        return;
+      case ModelPackage.VARIANT__LABEL:
+        setLabel((String)newValue);
+        return;
+      case ModelPackage.VARIANT__SOURCE:
+        setSource((String)newValue);
+        return;
+      case ModelPackage.VARIANT__JVM:
+        setJVM((JVM)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.VARIANT__TOUCHPOINTS:
+        getTouchpoints().clear();
+        return;
+      case ModelPackage.VARIANT__OS:
+        setOs(OS_EDEFAULT);
+        return;
+      case ModelPackage.VARIANT__ARCH:
+        setArch(ARCH_EDEFAULT);
+        return;
+      case ModelPackage.VARIANT__LABEL:
+        setLabel(LABEL_EDEFAULT);
+        return;
+      case ModelPackage.VARIANT__SOURCE:
+        setSource(SOURCE_EDEFAULT);
+        return;
+      case ModelPackage.VARIANT__JVM:
+        setJVM((JVM)null);
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case ModelPackage.VARIANT__TOUCHPOINTS:
+        return touchpoints != null && !touchpoints.isEmpty();
+      case ModelPackage.VARIANT__OS:
+        return OS_EDEFAULT == null ? os != null : !OS_EDEFAULT.equals(os);
+      case ModelPackage.VARIANT__ARCH:
+        return ARCH_EDEFAULT == null ? arch != null : !ARCH_EDEFAULT.equals(arch);
+      case ModelPackage.VARIANT__LABEL:
+        return LABEL_EDEFAULT == null ? label != null : !LABEL_EDEFAULT.equals(label);
+      case ModelPackage.VARIANT__SOURCE:
+        return SOURCE_EDEFAULT == null ? source != null : !SOURCE_EDEFAULT.equals(source);
+      case ModelPackage.VARIANT__JVM:
+        return getJVM() != null;
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass)
+  {
+    if (baseClass == Touchable.class)
+    {
+      switch (derivedFeatureID)
+      {
+        case ModelPackage.VARIANT__TOUCHPOINTS:
+          return ModelPackage.TOUCHABLE__TOUCHPOINTS;
+        default:
+          return -1;
+      }
+    }
+    return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass)
+  {
+    if (baseClass == Touchable.class)
+    {
+      switch (baseFeatureID)
+      {
+        case ModelPackage.TOUCHABLE__TOUCHPOINTS:
+          return ModelPackage.VARIANT__TOUCHPOINTS;
+        default:
+          return -1;
+      }
+    }
+    return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy())
+    {
+      return super.toString();
+    }
+
+    StringBuilder result = new StringBuilder(super.toString());
+    result.append(" (os: ");
+    result.append(os);
+    result.append(", arch: ");
+    result.append(arch);
+    result.append(", label: ");
+    result.append(label);
+    result.append(", source: ");
+    result.append(source);
+    result.append(')');
+    return result.toString();
+  }
+
+} //VariantImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/CodeGenUtil.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/CodeGenUtil.java
new file mode 100644
index 0000000..815d072
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/CodeGenUtil.java
@@ -0,0 +1,247 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import java.io.BufferedInputStream;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.PosixFileAttributeView;
+import java.nio.file.attribute.PosixFilePermission;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.URIConverter;
+
+
+public class CodeGenUtil
+{
+  private static final Path CACHE_FOLDER;
+  static
+  {
+    String property = System.getProperty("org.eclipse.justj.cache", System.getProperty("user.home") + "/.eclipse/org.eclipse.justj/cache");
+    CACHE_FOLDER = Paths.get(property).normalize();
+    if (!Files.isDirectory(CACHE_FOLDER))
+    {
+      try
+      {
+        Files.createDirectories(CACHE_FOLDER);
+      }
+      catch (IOException ex)
+      {
+        throw new RuntimeException(ex);
+      }
+    }
+  }
+
+  private CodeGenUtil()
+  {
+    throw new RuntimeException("Not instantiable");
+  }
+
+  public static Path getCache(Path cacheFolder, URIConverter uriConverter, URI uri) throws IOException
+  {
+    if (cacheFolder == null)
+    {
+      cacheFolder = Files.createTempDirectory("justj-local-cache");
+    }
+    else if (!Files.isDirectory(cacheFolder))
+    {
+      Files.createDirectories(cacheFolder);
+    }
+
+    String uriString = uri.toString();
+    String fileName = uriString.substring(uriString.lastIndexOf('/') + 1);
+    Path result = cacheFolder.resolve(fileName);
+    if (!Files.isRegularFile(result))
+    {
+      try (InputStream inputStream = uriConverter.createInputStream(uri))
+      {
+        System.err.println("Start download: " + uri);
+        Files.copy(inputStream, result);
+        System.err.println("Finish download: " + uri);
+      }
+    }
+    return result;
+  }
+
+  public static void untar(Path tarFile, UntarHandler handler) throws IOException
+  {
+    String fileName = tarFile.getFileName().toString();
+    try (InputStream fileInputStream = Files.newInputStream(tarFile);
+        InputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
+        InputStream gzipCompressorInputStream = fileName.endsWith(".gz") ? new GzipCompressorInputStream(bufferedInputStream) : bufferedInputStream;
+        TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(gzipCompressorInputStream);)
+    {
+      for (TarArchiveEntry entry; (entry = tarArchiveInputStream.getNextTarEntry()) != null;)
+      {
+        String name = entry.getName();
+        Path path = Paths.get(name).normalize();
+        Set<PosixFilePermission> posixFilePermissions = getPosixFilePermissions(entry);
+        boolean directory = entry.isDirectory();
+        if (directory)
+        {
+          handler.handleDirectory(path, posixFilePermissions);
+        }
+        else
+        {
+          boolean symbolicLink = entry.isSymbolicLink();
+          if (symbolicLink)
+          {
+            Path linkPath = Paths.get(entry.getLinkName());
+            handler.handleSymbolicLink(path, linkPath);
+          }
+          else
+          {
+            boolean file = entry.isFile();
+            if (file)
+            {
+              handler.handleRegularFile(tarArchiveInputStream, path, posixFilePermissions);
+            }
+            else
+            {
+              throw new IOException("Unhandled entry type");
+            }
+          }
+        }
+      }
+    }
+  }
+
+  private static Set<PosixFilePermission> getPosixFilePermissions(TarArchiveEntry entry)
+  {
+    int mode = entry.getMode();
+    Set<PosixFilePermission> perms = new TreeSet<>();
+    if ((mode & 0400) != 0)
+    {
+      perms.add(PosixFilePermission.OWNER_READ);
+    }
+    if ((mode & 0200) != 0)
+    {
+      perms.add(PosixFilePermission.OWNER_WRITE);
+    }
+    if ((mode & 0100) != 0)
+    {
+      perms.add(PosixFilePermission.OWNER_EXECUTE);
+    }
+    if ((mode & 0040) != 0)
+    {
+      perms.add(PosixFilePermission.GROUP_READ);
+    }
+    if ((mode & 0020) != 0)
+    {
+      perms.add(PosixFilePermission.GROUP_WRITE);
+    }
+    if ((mode & 0010) != 0)
+    {
+      perms.add(PosixFilePermission.GROUP_EXECUTE);
+    }
+    if ((mode & 0004) != 0)
+    {
+      perms.add(PosixFilePermission.OTHERS_READ);
+    }
+    if ((mode & 0002) != 0)
+    {
+      perms.add(PosixFilePermission.OTHERS_WRITE);
+    }
+    if ((mode & 0001) != 0)
+    {
+      perms.add(PosixFilePermission.OTHERS_EXECUTE);
+    }
+    return perms;
+  }
+
+  public static class UntarHandler
+  {
+    public void handleDirectory(Path path, Set<PosixFilePermission> posixFilePermissions) throws IOException
+    {
+    }
+
+    public void handleRegularFile(InputStream inputStream, Path path, Set<PosixFilePermission> posixFilePermissions) throws IOException
+    {
+    }
+
+    public void handleSymbolicLink(Path path, Path linkPath) throws IOException
+    {
+    }
+  }
+
+  public static class UntarToTargetHandler extends UntarHandler implements Closeable
+  {
+    private static final boolean POSIX = Files.getFileAttributeView(Paths.get("."), PosixFileAttributeView.class) != null;
+
+    private final Path target;
+
+    private final Map<Path, Path> symbolicLinks = new HashMap<>();
+
+    public UntarToTargetHandler(Path target)
+    {
+      this.target = target;
+    }
+
+    @Override
+    public void handleDirectory(Path path, Set<PosixFilePermission> posixFilePermissions) throws IOException
+    {
+      Path targetPath = target.resolve(path).normalize();
+      Files.createDirectories(targetPath);
+      if (POSIX)
+      {
+        Files.setPosixFilePermissions(targetPath, posixFilePermissions);
+      }
+    }
+
+    @Override
+    public void handleRegularFile(InputStream inputStream, Path path, Set<PosixFilePermission> posixFilePermissions) throws IOException
+    {
+      Path targetPath = target.resolve(path).normalize();
+      Files.copy(inputStream, targetPath, StandardCopyOption.REPLACE_EXISTING);
+      if (POSIX)
+      {
+        Files.setPosixFilePermissions(targetPath, posixFilePermissions);
+      }
+    }
+
+    @Override
+    public void handleSymbolicLink(Path path, Path linkPath) throws IOException
+    {
+      Path targetPath = target.resolve(path).normalize();
+      if (POSIX)
+      {
+        Files.createSymbolicLink(targetPath, linkPath);
+      }
+      else
+      {
+        Path resolvedLinkPath = targetPath.getParent().resolve(linkPath).normalize();
+        symbolicLinks.put(resolvedLinkPath, targetPath);
+      }
+    }
+
+    @Override
+    public void close() throws IOException
+    {
+      for (Map.Entry<Path, Path> entry : symbolicLinks.entrySet())
+      {
+        Files.copy(entry.getKey(), entry.getValue(), StandardCopyOption.REPLACE_EXISTING);
+      }
+    }
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/Generator.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/Generator.java
new file mode 100644
index 0000000..1268f95
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/Generator.java
@@ -0,0 +1,467 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.ProgressMonitorWrapper;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.emf.common.CommonPlugin;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Phase;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+public class Generator
+{
+  private final Model model;
+
+  private final URI target;
+
+  private final Path localCache;
+
+  private final URIConverter uriConverter;
+
+  public static void main(String[] args) throws IOException
+  {
+    Path path = Paths.get(args[0]);
+    Path realPath = path.toRealPath();
+    Generator generator = new Generator(URI.createFileURI(realPath.toString()));
+    generator.generate(new ProgressMonitorWrapper(new NullProgressMonitor())
+      {
+        @Override
+        public void subTask(String name)
+        {
+          super.subTask(name);
+          System.out.println(name);
+        }
+      });
+  }
+
+  public Generator(URI source) throws IOException
+  {
+    ModelPackage.eINSTANCE.eClass();
+
+    ResourceSet resourceSet = new ResourceSetImpl();
+    uriConverter = resourceSet.getURIConverter();
+    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("jregen", new ModelResourceFactoryImpl());
+
+    Resource resource = resourceSet.getResource(source, true);
+    model = (Model)resource.getContents().get(0);
+    this.target = computeTarget(model);
+    this.localCache = Reconciler.computeLocalCache(model);
+  }
+
+  public Generator(Model model)
+  {
+    this.model = model;
+    Resource resource = model.eResource();
+    uriConverter = resource.getResourceSet().getURIConverter();
+    this.target = computeTarget(model);
+    this.localCache = Reconciler.computeLocalCache(model);
+  }
+
+  private URI computeTarget(Model model)
+  {
+    String target = model.getTarget();
+    Resource resource = model.eResource();
+    if (target == null || target.trim().isEmpty())
+    {
+      return CommonPlugin.resolve(resource.getURI().trimSegments(0));
+    }
+    else
+    {
+      URI targetURI = URI.createURI(target);
+      if (targetURI.isRelative())
+      {
+        targetURI = targetURI.resolve(CommonPlugin.resolve(resource.getURI().trimSegments(0)));
+      }
+      return targetURI;
+    }
+  }
+
+  public Model getModel()
+  {
+    return model;
+  }
+
+  public URI getTarget()
+  {
+    return target;
+  }
+
+  public void generate(IProgressMonitor monitor) throws IOException
+  {
+    EList<JVM> jvms = model.getJVMs();
+
+    SubMonitor overallMonitor = SubMonitor.convert(monitor, "Generating " + model.getName() + " to " + target, jvms.size() + 1);
+
+    SubMonitor modelMonitor = overallMonitor.split(1);
+    modelMonitor.setWorkRemaining(9);
+
+    modelMonitor.beginTask("Generate Model Resources " + target, 5);
+
+    String name = model.getName();
+    modelMonitor.subTask("Generating .gitignore");
+    save(org.eclipse.justj.codegen.templates.GitIgnore.create(null).generate(model), target.appendSegment(".gitignore"), modelMonitor.split(1));
+    save(org.eclipse.justj.codegen.templates.POMXML.create(null).generate(model), target.appendSegment("pom.xml"), modelMonitor.split(1));
+
+    URI siteTarget = target.appendSegment("releng").appendSegment(name + ".site");
+    save(org.eclipse.justj.codegen.templates.releng.site.ProjectXML.create(null).generate(model), siteTarget.appendSegment(".project"), modelMonitor.split(1));
+    save(org.eclipse.justj.codegen.templates.releng.site.CategoryXML.create(null).generate(model), siteTarget.appendSegment("category.xml"), modelMonitor.split(1));
+    save(org.eclipse.justj.codegen.templates.releng.site.POMXML.create(null).generate(model), siteTarget.appendSegment("pom.xml"), modelMonitor.split(1));
+
+    URI parentTarget = target.appendSegment("releng").appendSegment(name + ".parent");
+    save(org.eclipse.justj.codegen.templates.releng.parent.ProjectXML.create(null).generate(model), parentTarget.appendSegment(".project"), modelMonitor.split(1));
+    save(org.eclipse.justj.codegen.templates.releng.parent.POMXML.create(null).generate(model), parentTarget.appendSegment("pom.xml"), modelMonitor.split(1));
+
+    save(
+      org.eclipse.justj.codegen.templates.releng.parent.features.POMXML.create(null).generate(model),
+      parentTarget.appendSegment("features").appendSegment("pom.xml"),
+      modelMonitor.split(1));
+
+    save(
+      org.eclipse.justj.codegen.templates.releng.parent.plugins.POMXML.create(null).generate(model),
+      parentTarget.appendSegment("plugins").appendSegment("pom.xml"),
+      modelMonitor.split(1));
+
+    String aboutURL = model.getAboutURL();
+    String aboutHTML = composeLines(load(URI.createURI(aboutURL)), "", org.eclipse.justj.codegen.templates.GitIgnore.create(null).NL);
+
+    for (JVM jvm : jvms)
+    {
+      SubMonitor jvmMonitor = overallMonitor.split(1);
+
+      EList<Variant> variants = jvm.getVariants();
+      jvmMonitor.setWorkRemaining(variants.size() + 17);
+
+      String jvmName = jvm.getName();
+      URI featureTarget = target.appendSegment("features").appendSegment(name + "." + jvmName + "-feature");
+      save(org.eclipse.justj.codegen.templates.feature.ProjectXML.create(null).generate(jvm), featureTarget.appendSegment(".project"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.feature.BuildProperties.create(null).generate(jvm), featureTarget.appendSegment("build.properties"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.feature.FeatureProperties.create(null).generate(jvm), featureTarget.appendSegment("feature.properties"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.feature.FeatureXML.create(null).generate(jvm), featureTarget.appendSegment("feature.xml"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.feature.POMXML.create(null).generate(jvm), featureTarget.appendSegment("pom.xml"), jvmMonitor.split(1));
+
+      URI pluginTarget = target.appendSegment("plugins").appendSegment(name + "." + jvmName);
+      save(org.eclipse.justj.codegen.templates.plugin.ProjectXML.create(null).generate(jvm), pluginTarget.appendSegment(".project"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.POMXML.create(null).generate(jvm), pluginTarget.appendSegment("pom.xml"), jvmMonitor.split(1));
+
+      URI pluginMetaInfTarget = pluginTarget.appendSegment("META-INF");
+      save(org.eclipse.justj.codegen.templates.plugin.Manifest.create(null).generate(jvm), pluginMetaInfTarget.appendSegment("MANIFEST.MF"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.P2Inf.create(null).generate(jvm), pluginMetaInfTarget.appendSegment("p2.inf"), jvmMonitor.split(1));
+
+      save(aboutHTML, pluginTarget.appendSegment("about.html"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.AboutIni.create(null).generate(jvm), pluginTarget.appendSegment("about.ini"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.AboutMappings.create(null).generate(jvm), pluginTarget.appendSegment("about.mappings"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.AboutProperties.create(null).generate(jvm), pluginTarget.appendSegment("about.properties"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.BuildProperties.create(null).generate(jvm), pluginTarget.appendSegment("build.properties"), jvmMonitor.split(1));
+      save(org.eclipse.justj.codegen.templates.plugin.PluginProperties.create(null).generate(jvm), pluginTarget.appendSegment("plugin.properties"), jvmMonitor.split(1));
+
+      String providerImageName = model.getProviderImageName();
+      save(model.getProviderImageData(), pluginTarget.appendSegment(providerImageName), jvmMonitor.split(1));
+
+      for (Variant variant : variants)
+      {
+        SubMonitor variantMonitor = jvmMonitor.split(1);
+        variantMonitor.setWorkRemaining(10);
+
+        String os = variant.getOs();
+        String arch = variant.getArch();
+        URI fragmentTarget = target.appendSegment("plugins").appendSegment(name + "." + jvmName + "." + os + "." + arch);
+        save(org.eclipse.justj.codegen.templates.fragment.ProjectXML.create(null).generate(variant), fragmentTarget.appendSegment(".project"), variantMonitor.split(1));
+
+        URI fragmentMetaInfTarget = fragmentTarget.appendSegment("META-INF");
+        save(org.eclipse.justj.codegen.templates.fragment.EclipseInf.create(null).generate(variant), fragmentMetaInfTarget.appendSegment("eclipse.inf"), variantMonitor.split(1));
+        save(org.eclipse.justj.codegen.templates.fragment.Manifest.create(null).generate(variant), fragmentMetaInfTarget.appendSegment("MANIFEST.MF"), variantMonitor.split(1));
+        save(org.eclipse.justj.codegen.templates.fragment.P2Inf.create(null).generate(variant), fragmentMetaInfTarget.appendSegment("p2.inf"), variantMonitor.split(1));
+
+        save(aboutHTML, fragmentTarget.appendSegment("about.html"), variantMonitor.split(1));
+        save(org.eclipse.justj.codegen.templates.fragment.AboutMappings.create(null).generate(variant), fragmentTarget.appendSegment("about.mappings"), variantMonitor.split(1));
+        save(
+          org.eclipse.justj.codegen.templates.fragment.BuildProperties.create(null).generate(variant),
+          fragmentTarget.appendSegment("build.properties"),
+          variantMonitor.split(1));
+        save(
+          org.eclipse.justj.codegen.templates.fragment.FragmentProperties.create(null).generate(variant),
+          fragmentTarget.appendSegment("fragment.properties"),
+          variantMonitor.split(1));
+        save(org.eclipse.justj.codegen.templates.fragment.POMXML.create(null).generate(variant), fragmentTarget.appendSegment("pom.xml"), variantMonitor.split(1));
+
+        URI fragmentJRETarget = fragmentTarget.appendSegment("jre");
+        save(org.eclipse.justj.codegen.templates.fragment.GitIgnore.create(null).generate(variant), fragmentJRETarget.appendSegment(".gitignore"), variantMonitor.split(1));
+
+        URI fragmentSettingsTarget = fragmentTarget.appendSegment(".settings");
+        save(
+          org.eclipse.justj.codegen.templates.fragment.PDEPrefs.create(null).generate(variant),
+          fragmentSettingsTarget.appendSegment("org.eclipse.pde.prefs"),
+          variantMonitor.split(1));
+
+        String source = variant.getSource();
+        if (source != null)
+        {
+          SubMonitor untarMonitor = variantMonitor.split(1);
+          Path sourceTarGZ = CodeGenUtil.getCache(localCache, uriConverter, URI.createURI(source));
+          untarMonitor.subTask("Untarring " + fragmentJRETarget.deresolve(target));
+          URI jreFolder = CommonPlugin.resolve(fragmentJRETarget);
+          if (jreFolder.isFile() && jreFolder.scheme() != null)
+          {
+            Path jrePath = Paths.get(jreFolder.toFileString());
+            CodeGenUtil.UntarToTargetHandler handler = new CodeGenUtil.UntarToTargetHandler(jrePath);
+            CodeGenUtil.untar(sourceTarGZ, handler);
+            handler.close();
+          }
+        }
+      }
+    }
+  }
+
+  protected void save(String text, URI target, SubMonitor monitor) throws IOException
+  {
+    monitor.subTask("Generating " + target.deresolve(this.target));
+    try (OutputStream out = uriConverter.createOutputStream(target); PrintStream print = new PrintStream(out, true, "UTF-8"))
+    {
+      print.print(text);
+    }
+  }
+
+  protected void save(URI source, URI target, SubMonitor monitor) throws IOException
+  {
+    monitor.subTask("Generating " + target.deresolve(this.target));
+    try (InputStream in = uriConverter.createInputStream(source); OutputStream out = uriConverter.createOutputStream(target))
+    {
+      byte[] buffer = new byte [10000];
+      int length = in.read(buffer);
+      out.write(buffer, 0, length);
+    }
+  }
+
+  protected void save(byte[] source, URI target, SubMonitor monitor) throws IOException
+  {
+    monitor.subTask("Generating " + target.deresolve(this.target));
+    try (OutputStream out = uriConverter.createOutputStream(target); PrintStream print = new PrintStream(out, true, "UTF-8"))
+    {
+      out.write(source);
+    }
+  }
+
+  protected String load(URI source) throws IOException
+  {
+    try (InputStream in = uriConverter.createInputStream(source))
+    {
+      byte[] buffer = new byte [100000];
+      int length = in.read(buffer);
+      return new String(buffer, 0, length, "UTF-8");
+    }
+  }
+
+  public static String getCopyright(Object argument, String prefix, String separator)
+  {
+    String copyrightText = null;
+    String copyrightYear = null;
+    String copyrightHolder = null;
+    for (Object object = argument; object instanceof Copyrightable;)
+    {
+      Copyrightable copyrightable = (Copyrightable)object;
+      if (copyrightText == null)
+      {
+        copyrightText = copyrightable.getCopyrightText();
+      }
+
+      if (copyrightYear == null)
+      {
+        copyrightYear = copyrightable.getCopyrightYear();
+      }
+
+      if (copyrightHolder == null)
+      {
+        copyrightHolder = copyrightable.getCopyrightHolder();
+      }
+
+      object = copyrightable.eContainer();
+    }
+
+    if (copyrightText != null)
+    {
+      if (copyrightHolder != null)
+      {
+        copyrightText = copyrightText.replace("${copyrightHolder}", copyrightHolder);
+      }
+
+      if (copyrightYear != null)
+      {
+        copyrightText = copyrightText.replace("${copyrightYear}", copyrightYear);
+      }
+
+      return composeLines(copyrightText, prefix, separator);
+    }
+
+    return "";
+  }
+
+  public static Map<String, Set<String>> getTouchpoints(Object argument)
+  {
+    Map<String, Set<String>> result = new LinkedHashMap<String, Set<String>>();
+    for (Object object = argument; object instanceof Touchable;)
+    {
+      Touchable touchable = (Touchable)object;
+      for (Touchpoint touchpoint : touchable.getTouchpoints())
+      {
+        EList<String> instructions = touchpoint.getInstructions();
+        if (!instructions.isEmpty())
+        {
+          Phase phase = touchpoint.getPhase();
+          Set<String> composedInstructions = result.get(phase.getLiteral());
+          if (composedInstructions == null)
+          {
+            composedInstructions = new LinkedHashSet<String>();
+            result.put(phase.getLiteral(), composedInstructions);
+          }
+          composedInstructions.addAll(instructions);
+        }
+      }
+
+      object = touchable.eContainer();
+    }
+
+    return result;
+  }
+
+  public static String composeLines(String body, String prefix, String separator)
+  {
+    if (body != null)
+    {
+      String[] lines = body.split("\r?\n", -1);
+      StringBuilder result = new StringBuilder();
+      for (int i = 0; i < lines.length; i++)
+      {
+        String line = lines[i];
+        result.append(prefix);
+        result.append(line);
+        if (i != lines.length - 1)
+        {
+          result.append(separator);
+        }
+      }
+
+      return result.toString();
+    }
+
+    return "";
+  }
+
+  public static String getVersionRange(String version)
+  {
+    int[] versionValue = getVersion(version);
+
+    return "[" + version + "," + versionValue[0] + '.' + versionValue[1] + '.' + (versionValue[2] + 1) + ")";
+  }
+
+  public static Map<String, Set<String>> getEECapabilities(String version)
+  {
+    int[] versionValue = getVersion(version);
+    Map<String, Set<String>> result = new LinkedHashMap<>();
+
+    Set<String> osgiMinimum = new LinkedHashSet<>();
+    result.put("OSGi/Minimum", osgiMinimum);
+    for (int i = 0; i <= 2; ++i)
+    {
+      osgiMinimum.add("1." + i);
+    }
+
+    Set<String> jre = new LinkedHashSet<>();
+    result.put("JRE", jre);
+    for (int i = 0; i <= 1; ++i)
+    {
+      jre.add("1." + i);
+    }
+
+    Set<String> javaSE = new LinkedHashSet<>();
+    result.put("JavaSE", javaSE);
+    for (int i = 0; i <= 8; ++i)
+    {
+      javaSE.add("1." + i);
+    }
+    for (int i = 9; i <= versionValue[0]; ++i)
+    {
+      javaSE.add("" + i + ".0");
+    }
+
+    for (int compact = 1; compact <= 3; ++compact)
+    {
+      Set<String> javaCompact = new LinkedHashSet<>();
+      result.put("JavaSE/compact" + compact, javaCompact);
+      javaCompact.add("1.8");
+      for (int i = 9; i <= versionValue[0]; ++i)
+      {
+        javaCompact.add("" + i + ".0");
+      }
+    }
+
+    return result;
+  }
+
+  public static class Application implements IApplication
+  {
+    @Override
+    public Object start(IApplicationContext context) throws Exception
+    {
+      System.out.println("start");
+      main((String[])context.getArguments().get("application.args"));
+      return null;
+    }
+
+    @Override
+    public void stop()
+    {
+    }
+  }
+
+  private static Pattern VERSION_PATTERN = Pattern.compile("([0-9]+)\\.([0-9]+)\\.([0-9]+)");
+
+  private static int[] getVersion(String version)
+  {
+    Matcher matcher = VERSION_PATTERN.matcher(version);
+    if (!matcher.matches())
+    {
+      throw new IllegalArgumentException("Invalid version " + version);
+    }
+
+    return new int []{ Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), Integer.parseInt(matcher.group(3)) };
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelAdapterFactory.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelAdapterFactory.java
new file mode 100644
index 0000000..87112b5
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelAdapterFactory.java
@@ -0,0 +1,249 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.ModelPackage
+ * @generated
+ */
+public class ModelAdapterFactory extends AdapterFactoryImpl
+{
+  /**
+   * The cached model package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static ModelPackage modelPackage;
+
+  /**
+   * Creates an instance of the adapter factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelAdapterFactory()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = ModelPackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * Returns whether this factory is applicable for the type of the object.
+   * <!-- begin-user-doc -->
+   * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+   * <!-- end-user-doc -->
+   * @return whether this factory is applicable for the type of the object.
+   * @generated
+   */
+  @Override
+  public boolean isFactoryForType(Object object)
+  {
+    if (object == modelPackage)
+    {
+      return true;
+    }
+    if (object instanceof EObject)
+    {
+      return ((EObject)object).eClass().getEPackage() == modelPackage;
+    }
+    return false;
+  }
+
+  /**
+   * The switch that delegates to the <code>createXXX</code> methods.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected ModelSwitch<Adapter> modelSwitch = new ModelSwitch<Adapter>()
+    {
+      @Override
+      public Adapter caseModel(Model object)
+      {
+        return createModelAdapter();
+      }
+
+      @Override
+      public Adapter caseJVM(JVM object)
+      {
+        return createJVMAdapter();
+      }
+
+      @Override
+      public Adapter caseVariant(Variant object)
+      {
+        return createVariantAdapter();
+      }
+
+      @Override
+      public Adapter caseCopyrightable(Copyrightable object)
+      {
+        return createCopyrightableAdapter();
+      }
+
+      @Override
+      public Adapter caseTouchpoint(Touchpoint object)
+      {
+        return createTouchpointAdapter();
+      }
+
+      @Override
+      public Adapter caseTouchable(Touchable object)
+      {
+        return createTouchableAdapter();
+      }
+
+      @Override
+      public Adapter defaultCase(EObject object)
+      {
+        return createEObjectAdapter();
+      }
+    };
+
+  /**
+   * Creates an adapter for the <code>target</code>.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param target the object to adapt.
+   * @return the adapter for the <code>target</code>.
+   * @generated
+   */
+  @Override
+  public Adapter createAdapter(Notifier target)
+  {
+    return modelSwitch.doSwitch((EObject)target);
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.justj.codegen.model.Model <em>Model</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.justj.codegen.model.Model
+   * @generated
+   */
+  public Adapter createModelAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.justj.codegen.model.JVM <em>JVM</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.justj.codegen.model.JVM
+   * @generated
+   */
+  public Adapter createJVMAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.justj.codegen.model.Variant <em>Variant</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.justj.codegen.model.Variant
+   * @generated
+   */
+  public Adapter createVariantAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.justj.codegen.model.Copyrightable <em>Copyrightable</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.justj.codegen.model.Copyrightable
+   * @generated
+   */
+  public Adapter createCopyrightableAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.justj.codegen.model.Touchpoint <em>Touchpoint</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.justj.codegen.model.Touchpoint
+   * @generated
+   */
+  public Adapter createTouchpointAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for an object of class '{@link org.eclipse.justj.codegen.model.Touchable <em>Touchable</em>}'.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null so that we can easily ignore cases;
+   * it's useful to ignore a case when inheritance will catch all the cases anyway.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @see org.eclipse.justj.codegen.model.Touchable
+   * @generated
+   */
+  public Adapter createTouchableAdapter()
+  {
+    return null;
+  }
+
+  /**
+   * Creates a new adapter for the default case.
+   * <!-- begin-user-doc -->
+   * This default implementation returns null.
+   * <!-- end-user-doc -->
+   * @return the new adapter.
+   * @generated
+   */
+  public Adapter createEObjectAdapter()
+  {
+    return null;
+  }
+
+} //ModelAdapterFactory
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelResourceFactoryImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelResourceFactoryImpl.java
new file mode 100644
index 0000000..d9c42bf
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelResourceFactoryImpl.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource Factory</b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.util.ModelResourceImpl
+ * @generated
+ */
+public class ModelResourceFactoryImpl extends ResourceFactoryImpl
+{
+  /**
+   * Creates an instance of the resource factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelResourceFactoryImpl()
+  {
+    super();
+  }
+
+  /**
+   * Creates an instance of the resource.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated NOT
+   */
+  @Override
+  public Resource createResource(URI uri)
+  {
+    XMLResource result = new ModelResourceImpl(uri);
+
+    Map<Object, Object> defaultSaveOptions = result.getDefaultSaveOptions();
+    defaultSaveOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
+    defaultSaveOptions.put(XMLResource.OPTION_LINE_WIDTH, 10);
+    defaultSaveOptions.put(XMLResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
+    defaultSaveOptions.put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
+
+    Map<Object, Object> defaultLoadOptions = result.getDefaultLoadOptions();
+    defaultLoadOptions.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
+    defaultLoadOptions.put(XMLResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
+    defaultLoadOptions.put(XMLResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
+
+    return result;
+  }
+
+} //ModelResourceFactoryImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelResourceImpl.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelResourceImpl.java
new file mode 100644
index 0000000..75574c1
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelResourceImpl.java
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource </b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.util.ModelResourceFactoryImpl
+ * @generated
+ */
+public class ModelResourceImpl extends XMLResourceImpl
+{
+  /**
+   * Creates an instance of the resource.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param uri the URI of the new resource.
+   * @generated
+   */
+  public ModelResourceImpl(URI uri)
+  {
+    super(uri);
+  }
+
+} //ModelResourceImpl
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelSwitch.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelSwitch.java
new file mode 100644
index 0000000..58f14ec
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelSwitch.java
@@ -0,0 +1,291 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.util.Switch;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.justj.codegen.model.ModelPackage
+ * @generated
+ */
+public class ModelSwitch<T> extends Switch<T>
+{
+  /**
+   * The cached model package
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected static ModelPackage modelPackage;
+
+  /**
+   * Creates an instance of the switch.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelSwitch()
+  {
+    if (modelPackage == null)
+    {
+      modelPackage = ModelPackage.eINSTANCE;
+    }
+  }
+
+  /**
+   * Checks whether this is a switch for the given package.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @param ePackage the package in question.
+   * @return whether this is a switch for the given package.
+   * @generated
+   */
+  @Override
+  protected boolean isSwitchFor(EPackage ePackage)
+  {
+    return ePackage == modelPackage;
+  }
+
+  /**
+   * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @return the first non-null result returned by a <code>caseXXX</code> call.
+   * @generated
+   */
+  @Override
+  protected T doSwitch(int classifierID, EObject theEObject)
+  {
+    switch (classifierID)
+    {
+      case ModelPackage.MODEL:
+      {
+        Model model = (Model)theEObject;
+        T result = caseModel(model);
+        if (result == null)
+        {
+          result = caseCopyrightable(model);
+        }
+        if (result == null)
+        {
+          result = caseTouchable(model);
+        }
+        if (result == null)
+        {
+          result = defaultCase(theEObject);
+        }
+        return result;
+      }
+      case ModelPackage.JVM:
+      {
+        JVM jvm = (JVM)theEObject;
+        T result = caseJVM(jvm);
+        if (result == null)
+        {
+          result = caseCopyrightable(jvm);
+        }
+        if (result == null)
+        {
+          result = caseTouchable(jvm);
+        }
+        if (result == null)
+        {
+          result = defaultCase(theEObject);
+        }
+        return result;
+      }
+      case ModelPackage.VARIANT:
+      {
+        Variant variant = (Variant)theEObject;
+        T result = caseVariant(variant);
+        if (result == null)
+        {
+          result = caseCopyrightable(variant);
+        }
+        if (result == null)
+        {
+          result = caseTouchable(variant);
+        }
+        if (result == null)
+        {
+          result = defaultCase(theEObject);
+        }
+        return result;
+      }
+      case ModelPackage.COPYRIGHTABLE:
+      {
+        Copyrightable copyrightable = (Copyrightable)theEObject;
+        T result = caseCopyrightable(copyrightable);
+        if (result == null)
+        {
+          result = defaultCase(theEObject);
+        }
+        return result;
+      }
+      case ModelPackage.TOUCHPOINT:
+      {
+        Touchpoint touchpoint = (Touchpoint)theEObject;
+        T result = caseTouchpoint(touchpoint);
+        if (result == null)
+        {
+          result = defaultCase(theEObject);
+        }
+        return result;
+      }
+      case ModelPackage.TOUCHABLE:
+      {
+        Touchable touchable = (Touchable)theEObject;
+        T result = caseTouchable(touchable);
+        if (result == null)
+        {
+          result = defaultCase(theEObject);
+        }
+        return result;
+      }
+      default:
+        return defaultCase(theEObject);
+    }
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Model</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Model</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseModel(Model object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>JVM</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>JVM</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseJVM(JVM object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Variant</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Variant</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseVariant(Variant object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Copyrightable</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Copyrightable</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseCopyrightable(Copyrightable object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Touchpoint</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Touchpoint</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseTouchpoint(Touchpoint object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>Touchable</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>Touchable</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+   * @generated
+   */
+  public T caseTouchable(Touchable object)
+  {
+    return null;
+  }
+
+  /**
+   * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+   * <!-- begin-user-doc -->
+   * This implementation returns null;
+   * returning a non-null result will terminate the switch, but this is the last case anyway.
+   * <!-- end-user-doc -->
+   * @param object the target of the switch.
+   * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+   * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+   * @generated
+   */
+  @Override
+  public T defaultCase(EObject object)
+  {
+    return null;
+  }
+
+} //ModelSwitch
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelXMLProcessor.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelXMLProcessor.java
new file mode 100644
index 0000000..028268b
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ModelXMLProcessor.java
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import java.util.Map;
+
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.util.XMLProcessor;
+import org.eclipse.justj.codegen.model.ModelPackage;
+
+
+/**
+ * This class contains helper methods to serialize and deserialize XML documents
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelXMLProcessor extends XMLProcessor
+{
+
+  /**
+   * Public constructor to instantiate the helper.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public ModelXMLProcessor()
+  {
+    super((EPackage.Registry.INSTANCE));
+    ModelPackage.eINSTANCE.eClass();
+  }
+
+  /**
+   * Register for "*" and "xml" file extensions the ModelResourceFactoryImpl factory.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected Map<String, Resource.Factory> getRegistrations()
+  {
+    if (registrations == null)
+    {
+      super.getRegistrations();
+      registrations.put(XML_EXTENSION, new ModelResourceFactoryImpl());
+      registrations.put(STAR_EXTENSION, new ModelResourceFactoryImpl());
+    }
+    return registrations;
+  }
+
+} //ModelXMLProcessor
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ProcessLauncher.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ProcessLauncher.java
new file mode 100644
index 0000000..576f7d0
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/ProcessLauncher.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.function.Consumer;
+
+
+public class ProcessLauncher
+{
+  public static void main(String[] args) throws IOException, InterruptedException
+  {
+    ProcessBuilder builder = new ProcessBuilder(args);
+
+    // This is needed on Windows to find gzip and won't hurt elsewhere.
+    Map<String, String> environment = builder.environment();
+    Path executable = Paths.get(args[0]);
+    String path = environment.get("PATH");
+    environment.put("PATH", path + File.pathSeparator + executable.getParent());
+
+    Process process = builder.start();
+    OutputStream stdin = process.getOutputStream();
+    stdin.close();
+
+    InputStream stderr = process.getErrorStream();
+    new StreamHandler(stderr, System.err::println).start();
+
+    Set<String> result = new TreeSet<>();
+    InputStream stdout = process.getInputStream();
+    new StreamHandler(stdout, line ->
+      {
+        // Consume the results.
+      }).start();
+
+    process.waitFor();
+
+    result.stream().forEach(System.out::println);
+
+    System.exit(process.exitValue());
+  }
+
+  private static class StreamHandler extends Thread
+  {
+    private final InputStream input;
+
+    private final Consumer<String> consumer;
+
+    public StreamHandler(InputStream input, Consumer<String> consumer)
+    {
+      this.input = input;
+      this.consumer = consumer;
+    }
+
+    @Override
+    public void run()
+    {
+      try (BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8")))
+      {
+        reader.lines().forEach(consumer);
+      }
+      catch (Exception ex)
+      {
+        ex.printStackTrace();
+      }
+    }
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/Reconciler.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/Reconciler.java
new file mode 100644
index 0000000..e786257
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/model/util/Reconciler.java
@@ -0,0 +1,708 @@
+/**
+ * Copyright (c) 2020 Eclipse contributors and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.model.util;
+
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.attribute.PosixFilePermission;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.emf.common.CommonPlugin;
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.justj.codegen.model.Copyrightable;
+import org.eclipse.justj.codegen.model.JVM;
+import org.eclipse.justj.codegen.model.Model;
+import org.eclipse.justj.codegen.model.ModelFactory;
+import org.eclipse.justj.codegen.model.ModelPackage;
+import org.eclipse.justj.codegen.model.ModelPlugin;
+import org.eclipse.justj.codegen.model.Phase;
+import org.eclipse.justj.codegen.model.Touchable;
+import org.eclipse.justj.codegen.model.Touchpoint;
+import org.eclipse.justj.codegen.model.Variant;
+
+
+public class Reconciler
+{
+  private final Model model;
+
+  private final URIConverter uriConverter;
+
+  private final URI source;
+
+  private Path localCache;
+
+  public static void main(String[] args) throws IOException, InterruptedException
+  {
+    ModelPackage.eINSTANCE.eClass();
+    Path path = Paths.get(args[0]);
+    Path realPath = path.toRealPath();
+    Reconciler reconciler = new Reconciler(URI.createFileURI(realPath.toString()));
+    reconciler.reconcile(null);
+  }
+
+  public Reconciler(URI modelURI) throws IOException
+  {
+    ResourceSet resourceSet = new ResourceSetImpl();
+    uriConverter = resourceSet.getURIConverter();
+    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("jregen", new ModelResourceFactoryImpl());
+
+    Resource resource = resourceSet.getResource(modelURI, true);
+    model = (Model)resource.getContents().get(0);
+    this.source = computeSource(model);
+    this.localCache = computeLocalCache(model);
+  }
+
+  public Reconciler(Model model)
+  {
+    this.model = model;
+    Resource resource = model.eResource();
+    uriConverter = resource.getResourceSet().getURIConverter();
+    this.source = computeSource(model);
+    this.localCache = computeLocalCache(model);
+  }
+
+  private static URI computeSource(Model model)
+  {
+    String source = model.getSource();
+    URI resourceURI = model.eResource().getURI();
+    if (source == null || source.trim().isEmpty())
+    {
+      return CommonPlugin.resolve(resourceURI.trimSegments(0)).appendSegment("justj.manifest");
+    }
+    else
+    {
+      URI sourceURI = URI.createURI(source);
+      if (sourceURI.isRelative())
+      {
+        sourceURI = sourceURI.resolve(CommonPlugin.resolve(resourceURI.trimSegments(0)));
+      }
+      return sourceURI;
+    }
+  }
+
+  static Path computeLocalCache(Model model)
+  {
+    String localCache = model.getLocalCache();
+    if (localCache == null)
+    {
+      return null;
+    }
+    else
+    {
+      Path path = Paths.get(localCache);
+      if (path.isAbsolute())
+      {
+        return path;
+      }
+      else
+      {
+        URI resourceURI = model.eResource().getURI();
+        URI resolvedURI = CommonPlugin.resolve(resourceURI).trimSegments(1);
+        Path result = Paths.get(resolvedURI.toFileString()).resolve(path).normalize();
+        return result;
+      }
+    }
+  }
+
+  public Model getModel()
+  {
+    return model;
+  }
+
+  public URI getSource()
+  {
+    return source;
+  }
+
+  public Model reconcile(IProgressMonitor monitor) throws IOException, InterruptedException
+  {
+    SubMonitor overallMonitor = SubMonitor.convert(monitor);
+    overallMonitor.beginTask("Reconciling " + source, 10);
+
+    Map<URI, Path> manifest = loadManifest(overallMonitor.split(9));
+
+    Model modelCopy = EcoreUtil.copy(model);
+
+    modelCopy.getJVMs().clear();
+
+    Exception failure = null;
+    SubMonitor manifestMonitor = overallMonitor.split(1);
+    manifestMonitor.setWorkRemaining(manifest.size());
+    for (Map.Entry<URI, Path> entry : manifest.entrySet())
+    {
+      URI jreURI = entry.getKey();
+      Path localCache = entry.getValue();
+
+      manifestMonitor.subTask("Processing " + jreURI);
+
+      try
+      {
+        TarAnalyzer handler = new TarAnalyzer();
+        CodeGenUtil.untar(localCache, handler);
+
+        Variant variant = handler.reconcile(modelCopy);
+        variant.setSource(jreURI.toString());
+      }
+      catch (Exception ex)
+      {
+        Files.deleteIfExists(localCache);
+        ModelPlugin.INSTANCE.log(ex);
+        failure = ex;
+      }
+
+      manifestMonitor.worked(1);
+    }
+
+    if (failure instanceof IOException)
+    {
+      throw (IOException)failure;
+    }
+    else if (failure instanceof RuntimeException)
+    {
+      throw (RuntimeException)failure;
+    }
+    else if (failure instanceof InterruptedException)
+    {
+      throw (InterruptedException)failure;
+    }
+    else if (failure != null)
+    {
+      throw new RuntimeException(failure);
+    }
+
+    if (Boolean.FALSE)
+    {
+      Resource resource = model.eResource();
+      URI uri = resource.getURI();
+      URI targetURI = uri.trimFileExtension().appendFileExtension("reconciled").appendFileExtension(uri.fileExtension());
+      resource.setURI(targetURI);
+      resource.save(null);
+    }
+
+    return modelCopy;
+  }
+
+  private static class TarAnalyzer extends CodeGenUtil.UntarHandler
+  {
+    private final Map<Path, Set<PosixFilePermission>> allPosixFilePermissions = new TreeMap<>();
+
+    private final Set<Path> regularFiles = new TreeSet<>();
+
+    private final Map<Path, Path> symblicLinks = new TreeMap<>();
+
+    private final Properties properties;
+
+    public TarAnalyzer()
+    {
+      properties = new Properties();
+    }
+
+    @Override
+    public void handleRegularFile(InputStream inputStream, Path path, Set<PosixFilePermission> posixFilePermissions) throws IOException
+    {
+      allPosixFilePermissions.put(path, posixFilePermissions);
+      if (path.endsWith("org.eclipse.justj.properties"))
+      {
+        properties.load(inputStream);
+      }
+
+      regularFiles.add(path);
+    }
+
+    @Override
+    public void handleDirectory(Path path, Set<PosixFilePermission> posixFilePermissions)
+    {
+      allPosixFilePermissions.put(path, posixFilePermissions);
+    }
+
+    @Override
+    public void handleSymbolicLink(Path path, Path linkPath)
+    {
+      symblicLinks.put(path, linkPath);
+    }
+
+    public Variant reconcile(Model model)
+    {
+      String jreName = properties.getProperty("org.eclipse.justj.name");
+      String label = properties.getProperty("org.eclipse.justj.label");
+
+      String javaVersion = properties.getProperty("java.version");
+
+      JVM jvm = getJVM(model, jreName, javaVersion);
+      jvm.setLabel(label);
+
+      String os = properties.getProperty("osgi.os");
+      String arch = properties.getProperty("osgi.arch");
+      Variant variant = getVariant(jvm, os, arch);
+
+      if (jvm.getAboutTextExtra() == null)
+      {
+        String aboutTextExtra = "\nVisit http://www.eclipse.org/justj";
+        String vendor = properties.getProperty("org.eclipse.justj.url.vendor");
+        aboutTextExtra += "\n\nProvides Java Runtimes derived from " + vendor;
+        jvm.setAboutTextExtra(aboutTextExtra);
+      }
+
+      EList<Touchpoint> touchpoints = variant.getTouchpoints();
+      Touchpoint touchpoint = ModelFactory.eINSTANCE.createTouchpoint();
+      touchpoint.setPhase(Phase.INSTALL);
+      touchpoints.add(touchpoint);
+
+      EList<String> instructions = touchpoint.getInstructions();
+      String vmArg = properties.getProperty("org.eclipse.justj.vm.arg");
+      instructions.add("org.eclipse.equinox.p2.touchpoint.eclipse.setJvm(jvm:${artifact.location}/jre/" + vmArg + ")");
+
+      if (!"win32".equals(os))
+      {
+        Set<Path> ignore = new HashSet<>();
+        Set<Path> executableFolders = new TreeSet<>();
+        Set<Path> executableFiles = new TreeSet<>();
+        for (Map.Entry<Path, Set<PosixFilePermission>> entry : allPosixFilePermissions.entrySet())
+        {
+          Path path = entry.getKey();
+          if (ignore.add(path))
+          {
+            Set<PosixFilePermission> posixPermissions = entry.getValue();
+            if (regularFiles.contains(path) && posixPermissions.contains(PosixFilePermission.OWNER_EXECUTE))
+            {
+              Path parent = path.getParent();
+              if (parent != null)
+              {
+                boolean allDescendantsOfParentExecutable = true;
+                Set<Path> allDescendants = new HashSet<>();
+                for (Map.Entry<Path, Set<PosixFilePermission>> otherEntry : allPosixFilePermissions.entrySet())
+                {
+                  Path otherPath = otherEntry.getKey();
+                  if (otherPath.startsWith(parent))
+                  {
+                    Set<PosixFilePermission> otherPosixFilePermissions = otherEntry.getValue();
+                    if (otherPosixFilePermissions.contains(PosixFilePermission.OWNER_EXECUTE))
+                    {
+                      allDescendants.add(otherPath);
+                    }
+                    else if (!symblicLinks.containsKey(otherPath))
+                    {
+                      allDescendantsOfParentExecutable = false;
+                      break;
+                    }
+                  }
+                }
+
+                if (allDescendantsOfParentExecutable)
+                {
+                  executableFolders.add(parent);
+                }
+                else
+                {
+                  executableFiles.add(path);
+                }
+
+                ignore.addAll(allDescendants);
+              }
+            }
+          }
+        }
+
+        if (executableFolders.isEmpty() || !executableFiles.isEmpty())
+        {
+          for (Path executableFolder : executableFolders)
+          {
+            String chmodTouchpointInstruction = "org.eclipse.equinox.p2.touchpoint.eclipse.chmod(targetDir:${artifact.location},targetFile:"
+              + executableFolder.normalize().toString().replace('\\', '/') + ",permissions:+x,options:-R";
+            instructions.add(chmodTouchpointInstruction);
+          }
+
+          for (Path executableFile : executableFiles)
+          {
+            String chmodTouchpointInstruction = "org.eclipse.equinox.p2.touchpoint.eclipse.chmod(targetDir:${artifact.location},targetFile:"
+              + executableFile.normalize().toString().replace('\\', '/') + ",permissions:+x";
+            instructions.add(chmodTouchpointInstruction);
+          }
+        }
+      }
+
+      return variant;
+    }
+
+    private JVM getJVM(Model model, String name, String javaVersion)
+    {
+      EList<JVM> jvms = model.getJVMs();
+      for (JVM jvm : jvms)
+      {
+        if (name.equals(jvm.getName()) && javaVersion.equals(jvm.getVersion()))
+        {
+          return jvm;
+        }
+      }
+
+      JVM jvm = ModelFactory.eINSTANCE.createJVM();
+      jvm.setName(name);
+      jvm.setVersion(javaVersion);
+      jvms.add(jvm);
+
+      ECollections.sort(jvms, (j1, j2) -> j1.getName().compareTo(j2.getName()));
+      return jvm;
+    }
+
+    private Variant getVariant(JVM jvm, String os, String arch)
+    {
+      EList<Variant> variants = jvm.getVariants();
+      for (Variant variant : variants)
+      {
+        if (os.equals(variant.getOs()) && arch.equals(variant.getArch()))
+        {
+          return variant;
+        }
+      }
+
+      Variant variant = ModelFactory.eINSTANCE.createVariant();
+      variant.setOs(os);
+      variant.setArch(arch);
+
+      String label;
+      switch (os)
+      {
+        case "linux":
+        {
+          label = "Linux";
+          break;
+        }
+        case "win32":
+        {
+          label = "Windows";
+          break;
+        }
+        case "macosx":
+        {
+          label = "MacOS";
+          break;
+        }
+        default:
+        {
+          label = os;
+          break;
+        }
+      };
+
+      switch (arch)
+      {
+        case "x86_64":
+        {
+          label += " 64 bit";
+          break;
+        }
+        default:
+        {
+          label = " " + arch;
+          break;
+        }
+      }
+
+      variant.setLabel(label);
+      variants.add(variant);
+      ECollections.sort(variants, (v1, v2) -> v1.getOs().compareTo(v2.getOs()));
+      return variant;
+    }
+  }
+
+  private Map<URI, Path> loadManifest(SubMonitor monitor) throws IOException, InterruptedException
+  {
+    String content = load(source);
+    List<String> jreURIs = Arrays.asList(content.split("\r?\n"));
+
+    int originalSize = jreURIs.size();
+    monitor.subTask("Fetching " + originalSize + " JREs");
+    monitor.setWorkRemaining(originalSize);
+
+    ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 4);
+    Map<URI, Future<Path>> jres = new LinkedHashMap<>();
+    AtomicInteger size = new AtomicInteger(originalSize);
+    jreURIs.forEach(jre ->
+      {
+        URI uri = URI.createURI(jre);
+        URI jreURI = uri.isRelative() ? uri.resolve(source) : uri;
+        jres.put(jreURI, executor.submit(() ->
+          {
+            try
+            {
+              return CodeGenUtil.getCache(localCache, uriConverter, jreURI);
+            }
+            finally
+            {
+              synchronized (monitor)
+              {
+                monitor.subTask("Fetcthing " + originalSize + " JREs; " + size.decrementAndGet() + " remaining");
+                monitor.worked(1);
+              }
+            }
+          }));
+      });
+
+    executor.shutdown();
+
+    // Wait for at most 20 minutes.
+    for (int elapsed = 0; elapsed < 60 * 20; elapsed += 2)
+    {
+      try
+      {
+        executor.awaitTermination(2, TimeUnit.SECONDS);
+        monitor.checkCanceled();
+        break;
+      }
+      catch (InterruptedException ex)
+      {
+        //$FALL-THROUGH$
+      }
+    }
+
+    Map<URI, Path> result = jres.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry ->
+      {
+        try
+        {
+          return entry.getValue().get();
+        }
+        catch (InterruptedException | ExecutionException e)
+        {
+          throw new RuntimeException(e);
+        }
+      }));
+
+    return result;
+  }
+
+  protected void save(String text, URI target) throws IOException
+  {
+    try (OutputStream out = uriConverter.createOutputStream(target); PrintStream print = new PrintStream(out, true, "UTF-8"))
+    {
+      print.print(text);
+    }
+  }
+
+  protected void save(URI source, URI target) throws IOException
+  {
+    try (InputStream in = uriConverter.createInputStream(source); OutputStream out = uriConverter.createOutputStream(target))
+    {
+      byte[] buffer = new byte [10000];
+      int length = in.read(buffer);
+      out.write(buffer, 0, length);
+    }
+  }
+
+  protected String load(URI source) throws IOException
+  {
+    try (InputStream in = uriConverter.createInputStream(source))
+    {
+      byte[] buffer = new byte [100000];
+      int length = in.read(buffer);
+      return new String(buffer, 0, length, "UTF-8");
+    }
+  }
+
+  protected void save(byte[] source, URI target) throws IOException
+  {
+    try (OutputStream out = uriConverter.createOutputStream(target); PrintStream print = new PrintStream(out, true, "UTF-8"))
+    {
+      out.write(source);
+    }
+  }
+
+  public static String getCopyright(Object argument, String prefix, String separator)
+  {
+    String copyrightText = null;
+    String copyrightYear = null;
+    String copyrightHolder = null;
+    for (Object object = argument; object instanceof Copyrightable;)
+    {
+      Copyrightable copyrightable = (Copyrightable)object;
+      if (copyrightText == null)
+      {
+        copyrightText = copyrightable.getCopyrightText();
+      }
+
+      if (copyrightYear == null)
+      {
+        copyrightYear = copyrightable.getCopyrightYear();
+      }
+
+      if (copyrightHolder == null)
+      {
+        copyrightHolder = copyrightable.getCopyrightHolder();
+      }
+
+      object = copyrightable.eContainer();
+    }
+
+    if (copyrightText != null)
+    {
+      if (copyrightHolder != null)
+      {
+        copyrightText = copyrightText.replace("${copyrightHolder}", copyrightHolder);
+      }
+
+      if (copyrightYear != null)
+      {
+        copyrightText = copyrightText.replace("${copyrightYear}", copyrightYear);
+      }
+
+      return composeLines(copyrightText, prefix, separator);
+    }
+
+    return "";
+  }
+
+  public static Map<String, Set<String>> getTouchpoints(Object argument)
+  {
+    Map<String, Set<String>> result = new LinkedHashMap<String, Set<String>>();
+    for (Object object = argument; object instanceof Touchable;)
+    {
+      Touchable touchable = (Touchable)object;
+      for (Touchpoint touchpoint : touchable.getTouchpoints())
+      {
+        EList<String> instructions = touchpoint.getInstructions();
+        if (!instructions.isEmpty())
+        {
+          Phase phase = touchpoint.getPhase();
+          Set<String> composedInstructions = result.get(phase.getLiteral());
+          if (composedInstructions == null)
+          {
+            composedInstructions = new LinkedHashSet<String>();
+            result.put(phase.getLiteral(), composedInstructions);
+          }
+          composedInstructions.addAll(instructions);
+        }
+      }
+
+      object = touchable.eContainer();
+    }
+
+    return result;
+  }
+
+  public static String composeLines(String body, String prefix, String separator)
+  {
+    if (body != null)
+    {
+      String[] lines = body.split("\r?\n", -1);
+      StringBuilder result = new StringBuilder();
+      for (int i = 0; i < lines.length; i++)
+      {
+        String line = lines[i];
+        result.append(prefix);
+        result.append(line);
+        if (i != lines.length - 1)
+        {
+          result.append(separator);
+        }
+      }
+
+      return result.toString();
+    }
+
+    return "";
+  }
+
+  public static String getVersionRange(String version)
+  {
+    int[] versionValue = getVersion(version);
+
+    return "[" + version + "," + versionValue[0] + '.' + versionValue[1] + '.' + (versionValue[2] + 1) + ")";
+  }
+
+  public static Map<String, Set<String>> getEECapabilities(String version)
+  {
+    int[] versionValue = getVersion(version);
+    Map<String, Set<String>> result = new LinkedHashMap<>();
+
+    Set<String> osgiMinimum = new LinkedHashSet<>();
+    result.put("OSGi/Minimum", osgiMinimum);
+    for (int i = 0; i <= 2; ++i)
+    {
+      osgiMinimum.add("1." + i);
+    }
+
+    Set<String> jre = new LinkedHashSet<>();
+    result.put("JRE", jre);
+    for (int i = 0; i <= 1; ++i)
+    {
+      jre.add("1." + i);
+    }
+
+    Set<String> javaSE = new LinkedHashSet<>();
+    result.put("JavaSE", javaSE);
+    for (int i = 0; i <= 8; ++i)
+    {
+      javaSE.add("1." + i);
+    }
+    for (int i = 9; i <= versionValue[0]; ++i)
+    {
+      javaSE.add("" + i + ".0");
+    }
+
+    for (int compact = 1; compact <= 3; ++compact)
+    {
+      Set<String> javaCompact = new LinkedHashSet<>();
+      result.put("JavaSE/compact" + compact, javaCompact);
+      javaCompact.add("1.8");
+      for (int i = 9; i <= versionValue[0]; ++i)
+      {
+        javaCompact.add("" + i + ".0");
+      }
+    }
+
+    return result;
+  }
+
+  private static Pattern VERSION_PATTERN = Pattern.compile("([0-9]+)\\.([0-9]+)\\.([0-9]+)");
+
+  private static int[] getVersion(String version)
+  {
+    Matcher matcher = VERSION_PATTERN.matcher(version);
+    if (!matcher.matches())
+    {
+      throw new IllegalArgumentException("Invalid version " + version);
+    }
+
+    return new int []{ Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), Integer.parseInt(matcher.group(3)) };
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/GitIgnore.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/GitIgnore.java
new file mode 100644
index 0000000..392607f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/GitIgnore.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates;
+
+public class GitIgnore
+{
+  protected static String nl;
+  public static synchronized GitIgnore create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    GitIgnore result = new GitIgnore();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "target/";
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_1);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/POMXML.java
new file mode 100644
index 0000000..0cba3f2
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/POMXML.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = ".parent</module>";
+  protected static final String _3 = "<!--";
+  protected static final String _4 = "</groupId>";
+  protected static final String _5 = "</modules>";
+  protected static final String _6 = "</project>";
+  protected static final String _7 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _8 = "<artifactId>org.eclipse.justj.root</artifactId>";
+  protected static final String _9 = "<groupId>";
+  protected static final String _10 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _11 = "<module>releng/";
+  protected static final String _12 = "<modules>";
+  protected static final String _13 = "<packaging>pom</packaging>";
+  protected static final String _14 = "<project";
+  protected static final String _15 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _16 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _17 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _18 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String _19 = NL + _1 + NL + _14 + NL_2 + _17 + NL_2 + _16 + NL_2 + _18 + NL_1 + _10 + NL + NL_1 + _9;
+  protected final String _20 = _4 + NL_1 + _8 + NL_1 + _15 + NL_1 + _13 + NL + NL_1 + _12 + NL_2 + _11;
+  protected final String _21 = _2 + NL_1 + _5 + NL + NL + _6;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+    builder.append(_7);
+    builder.append(NL);
+    builder.append(_3);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_19);
+    builder.append(model.getName());
+    builder.append(_20);
+    builder.append(model.getName());
+    builder.append(_21);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/BuildProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/BuildProperties.java
new file mode 100644
index 0000000..82b7461
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/BuildProperties.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.feature;
+
+public class BuildProperties
+{
+  protected static String nl;
+  public static synchronized BuildProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    BuildProperties result = new BuildProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "#";
+  protected static final String _2 = "bin.includes = feature.xml,\\";
+  protected static final String _3 = "feature.properties";
+  protected final String NL_1 = NL + "               ";
+  protected final String _4 = "";
+  protected final String _5 = NL + _1 + NL + NL + _2 + NL_1 + _3;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_4);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_5);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/FeatureProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/FeatureProperties.java
new file mode 100644
index 0000000..c5ef291
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/FeatureProperties.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.feature;
+
+import org.eclipse.justj.codegen.model.*;
+import org.eclipse.justj.codegen.model.util.Generator;
+
+public class FeatureProperties
+{
+  protected static String nl;
+  public static synchronized FeatureProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    FeatureProperties result = new FeatureProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = " ";
+  protected static final String _2 = "#";
+  protected static final String _3 = "\\n";
+  protected static final String _4 = "copyright = ";
+  protected static final String _5 = "description = Contains the plug-ins and fragments for the ";
+  protected static final String _6 = "featureName = ";
+  protected static final String _7 = "providerName = ";
+  protected final String _8 = "";
+  protected final String _9 = NL + _2 + NL + NL + _7;
+  protected final String _10 = NL + _6;
+  protected final String _11 = NL + _5;
+  protected final String _12 = NL + _4;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmLabel = jvm.getLabel();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+  String provider = model.getProvider();
+    builder.append(_8);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_9);
+    builder.append(provider);
+    builder.append(_10);
+    builder.append(modelLabel);
+    builder.append(_1);
+    builder.append(jvmLabel);
+    builder.append(_11);
+    builder.append(jvmLabel);
+    builder.append(_12);
+    builder.append(Generator.getCopyright(argument, "", "\\n\\" + NL));
+    builder.append(_3);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/FeatureXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/FeatureXML.java
new file mode 100644
index 0000000..92cdade
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/FeatureXML.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.feature;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class FeatureXML
+{
+  protected static String nl;
+  public static synchronized FeatureXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    FeatureXML result = new FeatureXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "%copyright";
+  protected static final String _2 = "%description";
+  protected static final String _3 = "%license";
+  protected static final String _4 = "-->";
+  protected static final String _5 = ".";
+  protected static final String _6 = ".qualifier\"";
+  protected static final String _7 = "<!--";
+  protected static final String _8 = "</copyright>";
+  protected static final String _9 = "</description>";
+  protected static final String _10 = "</feature>";
+  protected static final String _11 = "</license>";
+  protected static final String _12 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _13 = "<copyright>";
+  protected static final String _14 = "<description>";
+  protected static final String _15 = "<feature";
+  protected static final String _16 = "<license url=\"%licenseURL\">";
+  protected static final String _17 = "<plugin";
+  protected static final String _18 = "\"";
+  protected static final String _19 = "arch=\"";
+  protected static final String _20 = "download-size=\"0\"";
+  protected static final String _21 = "fragment=\"true\"/>";
+  protected static final String _22 = "id=\"";
+  protected static final String _23 = "install-size=\"0\"";
+  protected static final String _24 = "label=\"%featureName\"";
+  protected static final String _25 = "license-feature-version=\"0.0.0\">";
+  protected static final String _26 = "license-feature=\"org.eclipse.license\"";
+  protected static final String _27 = "os=\"";
+  protected static final String _28 = "provider-name=\"%providerName\"";
+  protected static final String _29 = "unpack=\"false\"/>";
+  protected static final String _30 = "version=\"";
+  protected static final String _31 = "version=\"0.0.0\"";
+  protected final String NL_1 = NL + "   ";
+  protected final String NL_2 = NL + "      ";
+  protected final String NL_3 = NL + "         ";
+  protected final String _32 = NL + _4 + NL + _15 + NL_2 + _22;
+  protected final String _33 = _18 + NL_2 + _24 + NL_2 + _30;
+  protected final String _34 = _6 + NL_2 + _28 + NL_2 + _26 + NL_2 + _25 + NL + NL_1 + _14 + NL_2 + _2 + NL_1 + _9 + NL + NL_1 + _13 + NL_2 + _1 + NL_1 + _8 + NL + NL_1 + _16 + NL_2 + _3 + NL_1 + _11 + NL + NL_1 + _17 + NL_3 + _22;
+  protected final String _35 = _18 + NL_3 + _20 + NL_3 + _23 + NL_3 + _31 + NL_3 + _29 + NL;
+  protected final String _36 = NL_1 + _17 + NL_3 + _22;
+  protected final String _37 = _18 + NL_3 + _27;
+  protected final String _38 = _18 + NL_3 + _19;
+  protected final String _39 = _18 + NL_3 + _20 + NL_3 + _23 + NL_3 + _31 + NL_3 + _21 + NL;
+  protected final String _40 = NL + _10;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();
+    builder.append(_12);
+    builder.append(NL);
+    builder.append(_7);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_32);
+    builder.append(fullName);
+    builder.append(_33);
+    builder.append(version);
+    builder.append(_34);
+    builder.append(fullName);
+    builder.append(_35);
+    for (Variant variant : jvm.getVariants()) {
+    String os = variant.getOs();
+    String arch = variant.getArch();
+    builder.append(_36);
+    builder.append(fullName);
+    builder.append(_5);
+    builder.append(os);
+    builder.append(_5);
+    builder.append(arch);
+    builder.append(_37);
+    builder.append(os);
+    builder.append(_38);
+    builder.append(arch);
+    builder.append(_39);
+    }
+    builder.append(_40);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/POMXML.java
new file mode 100644
index 0000000..4874893
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/POMXML.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.feature;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = "-SNAPSHOT</version>";
+  protected static final String _3 = ".features</artifactId>";
+  protected static final String _4 = ".features</groupId>";
+  protected static final String _5 = ".parent/features</relativePath>";
+  protected static final String _6 = "<!--";
+  protected static final String _7 = "</artifactId>";
+  protected static final String _8 = "</groupId>";
+  protected static final String _9 = "</parent>";
+  protected static final String _10 = "</project>";
+  protected static final String _11 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _12 = "<artifactId>";
+  protected static final String _13 = "<groupId>";
+  protected static final String _14 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _15 = "<packaging>eclipse-feature</packaging>";
+  protected static final String _16 = "<parent>";
+  protected static final String _17 = "<project";
+  protected static final String _18 = "<relativePath>../../releng/";
+  protected static final String _19 = "<version>";
+  protected static final String _20 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _21 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _22 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _23 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String _24 = NL + _1 + NL + _17 + NL_2 + _22 + NL_2 + _21 + NL_2 + _23 + NL_1 + _14 + NL + NL_1 + _16 + NL_2 + _13;
+  protected final String _25 = _8 + NL_2 + _12;
+  protected final String _26 = _3 + NL_2 + _20 + NL_2 + _18;
+  protected final String _27 = _5 + NL_1 + _9 + NL + NL_1 + _13;
+  protected final String _28 = _4 + NL_1 + _12;
+  protected final String _29 = _7 + NL_1 + _19;
+  protected final String _30 = _2 + NL_1 + _15 + NL + _10;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();
+    builder.append(_11);
+    builder.append(NL);
+    builder.append(_6);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_24);
+    builder.append(modelName);
+    builder.append(_25);
+    builder.append(modelName);
+    builder.append(_26);
+    builder.append(modelName);
+    builder.append(_27);
+    builder.append(modelName);
+    builder.append(_28);
+    builder.append(fullName);
+    builder.append(_29);
+    builder.append(version);
+    builder.append(_30);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/ProjectXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/ProjectXML.java
new file mode 100644
index 0000000..fb8cb8a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/feature/ProjectXML.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.feature;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class ProjectXML
+{
+  protected static String nl;
+  public static synchronized ProjectXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    ProjectXML result = new ProjectXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-feature</name>";
+  protected static final String _2 = ".";
+  protected static final String _3 = "</arguments>";
+  protected static final String _4 = "</buildCommand>";
+  protected static final String _5 = "</buildSpec>";
+  protected static final String _6 = "</filter>";
+  protected static final String _7 = "</filteredResources>";
+  protected static final String _8 = "</matcher>";
+  protected static final String _9 = "</projectDescription>";
+  protected static final String _10 = "</projects>";
+  protected static final String _11 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _12 = "<arguments>";
+  protected static final String _13 = "<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>";
+  protected static final String _14 = "<buildCommand>";
+  protected static final String _15 = "<buildSpec>";
+  protected static final String _16 = "<comment></comment>";
+  protected static final String _17 = "<filter>";
+  protected static final String _18 = "<filteredResources>";
+  protected static final String _19 = "<id>1396938000000</id>";
+  protected static final String _20 = "<id>org.eclipse.ui.ide.multiFilter</id>";
+  protected static final String _21 = "<matcher>";
+  protected static final String _22 = "<name>";
+  protected static final String _23 = "<name></name>";
+  protected static final String _24 = "<name>org.eclipse.pde.FeatureBuilder</name>";
+  protected static final String _25 = "<projectDescription>";
+  protected static final String _26 = "<projects>";
+  protected static final String _27 = "<type>10</type>";
+  protected final String NL_1 = NL + "\t";
+  protected final String NL_2 = NL + "\t\t";
+  protected final String NL_3 = NL + "\t\t\t";
+  protected final String NL_4 = NL + "\t\t\t\t";
+  protected final String _28 = _11 + NL + _25 + NL_1 + _22;
+  protected final String _29 = _1 + NL_1 + _16 + NL_1 + _26 + NL_1 + _10 + NL_1 + _15 + NL_2 + _14 + NL_3 + _24 + NL_3 + _12 + NL_3 + _3 + NL_2 + _4 + NL_1 + _5 + NL_1 + _18 + NL_2 + _17 + NL_3 + _19 + NL_3 + _23 + NL_3 + _27 + NL_3 + _21 + NL_4 + _20 + NL_4 + _13 + NL_3 + _8 + NL_2 + _6 + NL_1 + _7 + NL + _9;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+    builder.append(_28);
+    builder.append(modelName);
+    builder.append(_2);
+    builder.append(jvmName);
+    builder.append(_29);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/AboutMappings.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/AboutMappings.java
new file mode 100644
index 0000000..a9460fd
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/AboutMappings.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+public class AboutMappings
+{
+  protected static String nl;
+  public static synchronized AboutMappings create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    AboutMappings result = new AboutMappings();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "0=${build.id}";
+  protected static final String _2 = "1=${git.commit}";
+  protected final String _3 = _1 + NL + _2;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_3);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/BuildProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/BuildProperties.java
new file mode 100644
index 0000000..e740198
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/BuildProperties.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+public class BuildProperties
+{
+  protected static String nl;
+  public static synchronized BuildProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    BuildProperties result = new BuildProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "#";
+  protected static final String _2 = "about.html,\\";
+  protected static final String _3 = "about.mappings,\\";
+  protected static final String _4 = "bin.includes = META-INF/,\\";
+  protected static final String _5 = "fragment.properties,\\";
+  protected static final String _6 = "jre/";
+  protected final String NL_1 = NL + "               ";
+  protected final String _7 = "";
+  protected final String _8 = NL + _1 + NL + NL + _4 + NL_1 + _2 + NL_1 + _3 + NL_1 + _5 + NL_1 + _6;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_7);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_8);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/EclipseInf.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/EclipseInf.java
new file mode 100644
index 0000000..cc8255d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/EclipseInf.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+public class EclipseInf
+{
+  protected static String nl;
+  public static synchronized EclipseInf create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    EclipseInf result = new EclipseInf();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "jarprocessor.exclude.children.pack = true";
+  protected static final String _2 = "jarprocessor.exclude.pack = true";
+  protected final String _3 = _2 + NL + _1;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_3);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/FragmentProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/FragmentProperties.java
new file mode 100644
index 0000000..a6c2233
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/FragmentProperties.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class FragmentProperties
+{
+  protected static String nl;
+  public static synchronized FragmentProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    FragmentProperties result = new FragmentProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = " ";
+  protected static final String _2 = " for ";
+  protected static final String _3 = "#";
+  protected static final String _4 = "pluginName = ";
+  protected static final String _5 = "providerName = ";
+  protected final String _6 = "";
+  protected final String _7 = NL + _3 + NL + NL + _5;
+  protected final String _8 = NL + _4;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Variant variant = (Variant)argument;
+String variantLabel = variant.getLabel();
+  JVM jvm = variant.getJVM();
+  String jvmLabel = jvm.getLabel();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+  String provider = model.getProvider();
+    builder.append(_6);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_7);
+    builder.append(provider);
+    builder.append(_8);
+    builder.append(modelLabel);
+    builder.append(_1);
+    builder.append(jvmLabel);
+    builder.append(_2);
+    builder.append(variantLabel);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/GitIgnore.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/GitIgnore.java
new file mode 100644
index 0000000..4139c77
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/GitIgnore.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+public class GitIgnore
+{
+  protected static String nl;
+  public static synchronized GitIgnore create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    GitIgnore result = new GitIgnore();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "!.gitignore";
+  protected static final String _2 = "*";
+  protected final String _3 = _2 + NL + _1;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_3);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/Manifest.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/Manifest.java
new file mode 100644
index 0000000..49a0e89
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/Manifest.java
@@ -0,0 +1,97 @@
+package org.eclipse.justj.codegen.templates.fragment;
+
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.Set;
+import org.eclipse.justj.codegen.model.*;
+import org.eclipse.justj.codegen.model.util.Generator;
+
+public class Manifest
+{
+  protected static String nl;
+  public static synchronized Manifest create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    Manifest result = new Manifest();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = ") (osgi.arch=";
+  protected static final String _2 = "))";
+  protected static final String _3 = ",";
+  protected static final String _4 = ".qualifier";
+  protected static final String _5 = ";bundle-version=\"";
+  protected static final String _6 = ";singleton:=true";
+  protected static final String _7 = "Automatic-Module-Name: ";
+  protected static final String _8 = "Bundle-Localization: fragment";
+  protected static final String _9 = "Bundle-ManifestVersion: 2";
+  protected static final String _10 = "Bundle-Name: %pluginName";
+  protected static final String _11 = "Bundle-SymbolicName: ";
+  protected static final String _12 = "Bundle-Vendor: %providerName";
+  protected static final String _13 = "Bundle-Version: ";
+  protected static final String _14 = "Eclipse-BundleShape: dir";
+  protected static final String _15 = "Eclipse-PlatformFilter: (& (osgi.os=";
+  protected static final String _16 = "Fragment-Host: ";
+  protected static final String _17 = "Manifest-Version: 1.0";
+  protected static final String _18 = "Provide-Capability: ";
+  protected static final String _19 = "\"";
+  protected static final String _20 = "\";version:Version=\"";
+  protected static final String _21 = "osgi.ee;osgi.ee=\"";
+  protected final String NL_1 = NL + " ";
+  protected final String _22 = _17 + NL + _9 + NL + _11;
+  protected final String _23 = _6 + NL + _13;
+  protected final String _24 = _4 + NL + _8 + NL + _10 + NL + _12 + NL + _16;
+  protected final String _25 = _19 + NL + _14 + NL + _15;
+  protected final String _26 = _2 + NL + _7;
+  protected final String _27 = NL + _18;
+  protected final String _28 = NL_1 + _21;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Variant variant = (Variant)argument;
+  String os = variant.getOs();
+  String arch = variant.getArch();
+  JVM jvm = variant.getJVM();
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String hostName = modelName + '.' + jvmName;
+  String fullName = hostName + '.' + os + '.' + arch;
+  String version = jvm.getVersion();
+    builder.append(_22);
+    builder.append(fullName);
+    builder.append(_23);
+    builder.append(version);
+    builder.append(_24);
+    builder.append(hostName);
+    builder.append(_5);
+    builder.append(Generator.getVersionRange(version));
+    builder.append(_25);
+    builder.append(os);
+    builder.append(_1);
+    builder.append(arch);
+    builder.append(_26);
+    builder.append(fullName);
+    builder.append(_27);
+    
+    for (Iterator<Entry<String, Set<String>>> it = Generator.getEECapabilities(version).entrySet().iterator(); it.hasNext();) {
+    Entry<String, Set<String>> entry = it.next();
+    for (Iterator<String> it2 = entry.getValue().iterator(); it2.hasNext();) {
+      String eeVersion = it2.next();
+    builder.append(_28);
+    builder.append(entry.getKey());
+    builder.append(_20);
+    builder.append(eeVersion);
+    builder.append(_19);
+    if (it.hasNext() || it2.hasNext()) {
+    builder.append(_3);
+    }
+    }
+    }
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/P2Inf.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/P2Inf.java
new file mode 100644
index 0000000..12e4c32
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/P2Inf.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+import java.util.*;
+import java.util.Iterator;
+import org.eclipse.justj.codegen.model.*;
+import org.eclipse.justj.codegen.model.util.Generator;
+
+public class P2Inf
+{
+  protected static String nl;
+  public static synchronized P2Inf create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    P2Inf result = new P2Inf();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = " = \\";
+  protected static final String _2 = "#";
+  protected static final String _3 = ";";
+  protected static final String _4 = "\\";
+  protected static final String _5 = "instructions.";
+  protected final String NL_1 = NL + "  ";
+  protected final String _6 = "";
+  protected final String _7 = NL + _2 + NL;
+  protected final String _8 = NL + _5;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Variant variant = (Variant)argument;
+    builder.append(_6);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_7);
+    Map<String, Set<String>> touchpoints = Generator.getTouchpoints(variant);
+  for (Map.Entry<String, Set<String>> entry : touchpoints.entrySet()) {
+    String phase = entry.getKey();
+    builder.append(_8);
+    builder.append(phase);
+    builder.append(_1);
+    for (Iterator<String> it = entry.getValue().iterator(); it.hasNext();) {
+      String instruction = it.next();
+    builder.append(NL_1);
+    builder.append(instruction);
+    builder.append(_3);
+    if (it.hasNext()) {
+    builder.append(_4);
+    }
+    }
+    builder.append(NL);
+    }
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/PDEPrefs.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/PDEPrefs.java
new file mode 100644
index 0000000..10a69a4
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/PDEPrefs.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+public class PDEPrefs
+{
+  protected static String nl;
+  public static synchronized PDEPrefs create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    PDEPrefs result = new PDEPrefs();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "compilers.incompatible-environment=2";
+  protected static final String _2 = "eclipse.preferences.version=1";
+  protected final String _3 = _2 + NL + _1;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_3);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/POMXML.java
new file mode 100644
index 0000000..a01b5bc
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/POMXML.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = "-SNAPSHOT</version>";
+  protected static final String _3 = ".parent/plugins</relativePath>";
+  protected static final String _4 = ".plugins</artifactId>";
+  protected static final String _5 = "<!--";
+  protected static final String _6 = "</arch>";
+  protected static final String _7 = "</artifactId>";
+  protected static final String _8 = "</build>";
+  protected static final String _9 = "</configuration>";
+  protected static final String _10 = "</environment>";
+  protected static final String _11 = "</environments>";
+  protected static final String _12 = "</groupId>";
+  protected static final String _13 = "</includes>";
+  protected static final String _14 = "</os>";
+  protected static final String _15 = "</parent>";
+  protected static final String _16 = "</plugin>";
+  protected static final String _17 = "</plugins>";
+  protected static final String _18 = "</project>";
+  protected static final String _19 = "</resource>";
+  protected static final String _20 = "</resources>";
+  protected static final String _21 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _22 = "<arch>";
+  protected static final String _23 = "<artifactId>";
+  protected static final String _24 = "<artifactId>target-platform-configuration</artifactId>";
+  protected static final String _25 = "<build>";
+  protected static final String _26 = "<configuration>";
+  protected static final String _27 = "<directory>.</directory>";
+  protected static final String _28 = "<environment>";
+  protected static final String _29 = "<environments>";
+  protected static final String _30 = "<filtering>true</filtering>";
+  protected static final String _31 = "<groupId>";
+  protected static final String _32 = "<groupId>org.eclipse.tycho</groupId>";
+  protected static final String _33 = "<include>about.mappings</include>";
+  protected static final String _34 = "<includes>";
+  protected static final String _35 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _36 = "<os>";
+  protected static final String _37 = "<packaging>eclipse-plugin</packaging>";
+  protected static final String _38 = "<parent>";
+  protected static final String _39 = "<plugin>";
+  protected static final String _40 = "<plugins>";
+  protected static final String _41 = "<project";
+  protected static final String _42 = "<relativePath>../../releng/";
+  protected static final String _43 = "<resolver>p2</resolver>";
+  protected static final String _44 = "<resource>";
+  protected static final String _45 = "<resources>";
+  protected static final String _46 = "<version>";
+  protected static final String _47 = "<version>${tycho-version}</version>";
+  protected static final String _48 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _49 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _50 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _51 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String NL_3 = NL + "      ";
+  protected final String NL_4 = NL + "        ";
+  protected final String NL_5 = NL + "          ";
+  protected final String NL_6 = NL + "            ";
+  protected final String NL_7 = NL + "              ";
+  protected final String _52 = NL + _1 + NL + _41 + NL_2 + _50 + NL_2 + _49 + NL_2 + _51 + NL_1 + _35 + NL + NL_1 + _38 + NL_2 + _31;
+  protected final String _53 = _12 + NL_2 + _23;
+  protected final String _54 = _4 + NL_2 + _48 + NL_2 + _42;
+  protected final String _55 = _3 + NL_1 + _15 + NL + NL_1 + _31;
+  protected final String _56 = _12 + NL_1 + _23;
+  protected final String _57 = _7 + NL_1 + _46;
+  protected final String _58 = _2 + NL_1 + _37 + NL + NL_1 + _25 + NL_2 + _45 + NL_3 + _44 + NL_4 + _27 + NL_4 + _30 + NL_4 + _34 + NL_5 + _33 + NL_4 + _13 + NL_3 + _19 + NL_2 + _20 + NL_2 + _40 + NL_3 + _39 + NL_4 + _32 + NL_4 + _24 + NL_4 + _47 + NL_4 + _26 + NL_5 + _43 + NL_5 + _29 + NL_6 + _28 + NL_7 + _36;
+  protected final String _59 = _14 + NL_7 + _22;
+  protected final String _60 = _6 + NL_6 + _10 + NL_5 + _11 + NL_4 + _9 + NL_3 + _16 + NL_2 + _17 + NL_1 + _8 + NL + NL + _18;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Variant variant = (Variant)argument;
+  String os = variant.getOs();
+  String arch = variant.getArch();
+  JVM jvm = variant.getJVM();
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName + '.' + os + '.' + arch;
+  String version = jvm.getVersion();
+    builder.append(_21);
+    builder.append(NL);
+    builder.append(_5);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_52);
+    builder.append(modelName);
+    builder.append(_53);
+    builder.append(modelName);
+    builder.append(_54);
+    builder.append(modelName);
+    builder.append(_55);
+    builder.append(modelName);
+    builder.append(_56);
+    builder.append(fullName);
+    builder.append(_57);
+    builder.append(version);
+    builder.append(_58);
+    builder.append(os);
+    builder.append(_59);
+    builder.append(arch);
+    builder.append(_60);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/ProjectXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/ProjectXML.java
new file mode 100644
index 0000000..a951cda
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/fragment/ProjectXML.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.fragment;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class ProjectXML
+{
+  protected static String nl;
+  public static synchronized ProjectXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    ProjectXML result = new ProjectXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = ".";
+  protected static final String _2 = "</arguments>";
+  protected static final String _3 = "</buildCommand>";
+  protected static final String _4 = "</buildSpec>";
+  protected static final String _5 = "</filter>";
+  protected static final String _6 = "</filteredResources>";
+  protected static final String _7 = "</matcher>";
+  protected static final String _8 = "</name>";
+  protected static final String _9 = "</natures>";
+  protected static final String _10 = "</projectDescription>";
+  protected static final String _11 = "</projects>";
+  protected static final String _12 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _13 = "<arguments>";
+  protected static final String _14 = "<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>";
+  protected static final String _15 = "<buildCommand>";
+  protected static final String _16 = "<buildSpec>";
+  protected static final String _17 = "<comment></comment>";
+  protected static final String _18 = "<filter>";
+  protected static final String _19 = "<filteredResources>";
+  protected static final String _20 = "<id>1396938000000</id>";
+  protected static final String _21 = "<id>org.eclipse.ui.ide.multiFilter</id>";
+  protected static final String _22 = "<matcher>";
+  protected static final String _23 = "<name>";
+  protected static final String _24 = "<name></name>";
+  protected static final String _25 = "<name>org.eclipse.pde.ManifestBuilder</name>";
+  protected static final String _26 = "<nature>org.eclipse.pde.PluginNature</nature>";
+  protected static final String _27 = "<natures>";
+  protected static final String _28 = "<projectDescription>";
+  protected static final String _29 = "<projects>";
+  protected static final String _30 = "<type>10</type>";
+  protected final String NL_1 = NL + "\t";
+  protected final String NL_2 = NL + "\t\t";
+  protected final String NL_3 = NL + "\t\t\t";
+  protected final String NL_4 = NL + "\t\t\t\t";
+  protected final String _31 = _12 + NL + _28 + NL_1 + _23;
+  protected final String _32 = _8 + NL_1 + _17 + NL_1 + _29 + NL_1 + _11 + NL_1 + _16 + NL_2 + _15 + NL_3 + _25 + NL_3 + _13 + NL_3 + _2 + NL_2 + _3 + NL_1 + _4 + NL_1 + _27 + NL_2 + _26 + NL_1 + _9 + NL_1 + _19 + NL_2 + _18 + NL_3 + _20 + NL_3 + _24 + NL_3 + _30 + NL_3 + _22 + NL_4 + _21 + NL_4 + _14 + NL_3 + _7 + NL_2 + _5 + NL_1 + _6 + NL + _10;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Variant variant = (Variant)argument;
+  String os = variant.getOs();
+  String arch = variant.getArch();
+  JVM jvm = variant.getJVM();
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+    builder.append(_31);
+    builder.append(modelName);
+    builder.append(_1);
+    builder.append(jvmName);
+    builder.append(_1);
+    builder.append(os);
+    builder.append(_1);
+    builder.append(arch);
+    builder.append(_32);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutIni.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutIni.java
new file mode 100644
index 0000000..b9eaeb2
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutIni.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class AboutIni
+{
+  protected static String nl;
+  public static synchronized AboutIni create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    AboutIni result = new AboutIni();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "#";
+  protected static final String _2 = "# Property \"aboutText\" contains blurb for \"About\" dialog (translated)";
+  protected static final String _3 = "# Property \"appName\" contains name of the application (translated)";
+  protected static final String _4 = "# Property \"featureImage\" contains path to feature image (32x32)";
+  protected static final String _5 = "aboutText=%featureText";
+  protected static final String _6 = "appName=%featureName";
+  protected static final String _7 = "featureImage=";
+  protected final String _8 = "";
+  protected final String _9 = NL + _1 + NL + NL + _2 + NL + _5 + NL + NL + _4 + NL + _7;
+  protected final String _10 = NL + NL + _3 + NL + _6;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  Model model = jvm.getModel();
+  String providerImageName = model.getProviderImageName();
+    builder.append(_8);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_9);
+    builder.append(providerImageName);
+    builder.append(_10);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutMappings.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutMappings.java
new file mode 100644
index 0000000..3de0582
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutMappings.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+public class AboutMappings
+{
+  protected static String nl;
+  public static synchronized AboutMappings create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    AboutMappings result = new AboutMappings();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "0=${build.id}";
+  protected static final String _2 = "1=${git.commit}";
+  protected final String _3 = _1 + NL + _2;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    builder.append(_3);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutProperties.java
new file mode 100644
index 0000000..a949e32
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/AboutProperties.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+import org.eclipse.justj.codegen.model.util.Generator;
+
+public class AboutProperties
+{
+  protected static String nl;
+  public static synchronized AboutProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    AboutProperties result = new AboutProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = " ";
+  protected static final String _2 = "#";
+  protected static final String _3 = "Build: {0}\\n\\";
+  protected static final String _4 = "Commit: {1}\\n\\";
+  protected static final String _5 = "Version: {featureVersion}\\n\\";
+  protected static final String _6 = "\\n";
+  protected static final String _7 = "\\n\\";
+  protected static final String _8 = "copyright = ";
+  protected static final String _9 = "description = Contains the plug-ins and fragments for the ";
+  protected static final String _10 = "featureName = ";
+  protected static final String _11 = "featureText = ";
+  protected static final String _12 = "providerName = Eclipse ";
+  protected final String _13 = "";
+  protected final String _14 = NL + _2 + NL + NL + _12;
+  protected final String _15 = NL + _10;
+  protected final String _16 = NL + _9;
+  protected final String _17 = NL + _8;
+  protected final String _18 = _6 + NL + _10;
+  protected final String _19 = NL + _11;
+  protected final String _20 = _7 + NL + _7 + NL + _5 + NL + _4 + NL + _3 + NL + _7;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmLabel = jvm.getLabel();
+  String aboutTextExtra = jvm.getAboutTextExtra();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+    builder.append(_13);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_14);
+    builder.append(modelLabel);
+    builder.append(_15);
+    builder.append(modelLabel);
+    builder.append(_1);
+    builder.append(jvmLabel);
+    builder.append(_16);
+    builder.append(jvmLabel);
+    builder.append(_17);
+    builder.append(Generator.getCopyright(argument, "", "\\n\\" + NL));
+    builder.append(_18);
+    builder.append(modelLabel);
+    builder.append(_1);
+    builder.append(jvmLabel);
+    builder.append(_19);
+    builder.append(modelLabel);
+    builder.append(_1);
+    builder.append(jvmLabel);
+    builder.append(_20);
+    builder.append(NL);
+    builder.append(Generator.getCopyright(argument, "", "\\n\\" + NL));
+    builder.append(_7);
+    builder.append(NL);
+    builder.append(Generator.composeLines(aboutTextExtra, "", "\\n\\" + NL));
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/BuildProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/BuildProperties.java
new file mode 100644
index 0000000..7d7f5f9
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/BuildProperties.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class BuildProperties
+{
+  protected static String nl;
+  public static synchronized BuildProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    BuildProperties result = new BuildProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "#";
+  protected static final String _2 = "about.html,\\";
+  protected static final String _3 = "about.ini,\\";
+  protected static final String _4 = "about.mappings,\\";
+  protected static final String _5 = "about.properties,\\";
+  protected static final String _6 = "bin.includes = META-INF/,\\";
+  protected static final String _7 = "plugin.properties,\\";
+  protected final String NL_1 = NL + "               ";
+  protected final String _8 = "";
+  protected final String _9 = NL + _1 + NL + NL + _6 + NL_1 + _2 + NL_1 + _7 + NL_1 + _3 + NL_1 + _4 + NL_1 + _5;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  Model model = jvm.getModel();
+  String providerImageName = model.getProviderImageName();
+    builder.append(_8);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_9);
+    builder.append(NL_1);
+    builder.append(providerImageName);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/Manifest.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/Manifest.java
new file mode 100644
index 0000000..45d9c9a
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/Manifest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class Manifest
+{
+  protected static String nl;
+  public static synchronized Manifest create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    Manifest result = new Manifest();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = ".qualifier";
+  protected static final String _2 = ";singleton:=true";
+  protected static final String _3 = "Automatic-Module-Name: ";
+  protected static final String _4 = "Bundle-ClassPath: .";
+  protected static final String _5 = "Bundle-Localization: plugin";
+  protected static final String _6 = "Bundle-ManifestVersion: 2";
+  protected static final String _7 = "Bundle-Name: %pluginName";
+  protected static final String _8 = "Bundle-SymbolicName: ";
+  protected static final String _9 = "Bundle-Vendor: %providerName";
+  protected static final String _10 = "Bundle-Version: ";
+  protected static final String _11 = "Manifest-Version: 1.0";
+  protected final String _12 = _11 + NL + _6 + NL + _8;
+  protected final String _13 = _2 + NL + _10;
+  protected final String _14 = _1 + NL + _4 + NL + _7 + NL + _9 + NL + _5 + NL + _3;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();
+    builder.append(_12);
+    builder.append(fullName);
+    builder.append(_13);
+    builder.append(version);
+    builder.append(_14);
+    builder.append(fullName);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/P2Inf.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/P2Inf.java
new file mode 100644
index 0000000..cb48be2
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/P2Inf.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class P2Inf
+{
+  protected static String nl;
+  public static synchronized P2Inf create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    P2Inf result = new P2Inf();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "#";
+  protected static final String _2 = "# Ensure that the applicable implementation fragment gets installed automatically.";
+  protected static final String _3 = ")(!(";
+  protected static final String _4 = ")(osgi.arch=";
+  protected static final String _5 = ".";
+  protected static final String _6 = ".buildtime=true)))";
+  protected static final String _7 = ".filter = (&(osgi.os=";
+  protected static final String _8 = ".name = ";
+  protected static final String _9 = ".namespace = org.eclipse.equinox.p2.iu";
+  protected static final String _10 = ".range = [$version$,$version$]";
+  protected static final String _11 = "requires.";
+  protected final String _12 = "";
+  protected final String _13 = NL + _1 + NL + _2 + NL;
+  protected final String _14 = NL + NL + _11;
+  protected final String _15 = _9 + NL + _11;
+  protected final String _16 = NL + _11;
+  protected final String _17 = _10 + NL + _11;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+    builder.append(_12);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_13);
+    int count = 0;
+  for (Variant variant : jvm.getVariants()) {
+    ++count;
+    String os = variant.getOs();
+    String arch = variant.getArch();
+    builder.append(_14);
+    builder.append(count);
+    builder.append(_15);
+    builder.append(count);
+    builder.append(_8);
+    builder.append(fullName);
+    builder.append(_5);
+    builder.append(os);
+    builder.append(_5);
+    builder.append(arch);
+    builder.append(_16);
+    builder.append(count);
+    builder.append(_17);
+    builder.append(count);
+    builder.append(_7);
+    builder.append(os);
+    builder.append(_4);
+    builder.append(arch);
+    builder.append(_3);
+    builder.append(modelName);
+    builder.append(_6);
+    }
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/POMXML.java
new file mode 100644
index 0000000..c2f9477
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/POMXML.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = "-SNAPSHOT</version>";
+  protected static final String _3 = ".parent/plugins</relativePath>";
+  protected static final String _4 = ".plugins</artifactId>";
+  protected static final String _5 = "<!--";
+  protected static final String _6 = "</artifactId>";
+  protected static final String _7 = "</build>";
+  protected static final String _8 = "</groupId>";
+  protected static final String _9 = "</includes>";
+  protected static final String _10 = "</parent>";
+  protected static final String _11 = "</project>";
+  protected static final String _12 = "</resource>";
+  protected static final String _13 = "</resources>";
+  protected static final String _14 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _15 = "<artifactId>";
+  protected static final String _16 = "<build>";
+  protected static final String _17 = "<directory>.</directory>";
+  protected static final String _18 = "<filtering>true</filtering>";
+  protected static final String _19 = "<groupId>";
+  protected static final String _20 = "<include>about.mappings</include>";
+  protected static final String _21 = "<includes>";
+  protected static final String _22 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _23 = "<packaging>eclipse-plugin</packaging>";
+  protected static final String _24 = "<parent>";
+  protected static final String _25 = "<project";
+  protected static final String _26 = "<relativePath>../../releng/";
+  protected static final String _27 = "<resource>";
+  protected static final String _28 = "<resources>";
+  protected static final String _29 = "<version>";
+  protected static final String _30 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _31 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _32 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _33 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String NL_3 = NL + "      ";
+  protected final String NL_4 = NL + "        ";
+  protected final String NL_5 = NL + "          ";
+  protected final String _34 = NL + _1 + NL + _25 + NL_2 + _32 + NL_2 + _31 + NL_2 + _33 + NL_1 + _22 + NL + NL_1 + _24 + NL_2 + _19;
+  protected final String _35 = _8 + NL_2 + _15;
+  protected final String _36 = _4 + NL_2 + _30 + NL_2 + _26;
+  protected final String _37 = _3 + NL_1 + _10 + NL + NL_1 + _19;
+  protected final String _38 = _8 + NL_1 + _15;
+  protected final String _39 = _6 + NL_1 + _29;
+  protected final String _40 = _2 + NL_1 + _23 + NL + NL_1 + _16 + NL_2 + _28 + NL_3 + _27 + NL_4 + _17 + NL_4 + _18 + NL_4 + _21 + NL_5 + _20 + NL_4 + _9 + NL_3 + _12 + NL_2 + _13 + NL_1 + _7 + NL + NL + _11;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();
+    builder.append(_14);
+    builder.append(NL);
+    builder.append(_5);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_34);
+    builder.append(modelName);
+    builder.append(_35);
+    builder.append(modelName);
+    builder.append(_36);
+    builder.append(modelName);
+    builder.append(_37);
+    builder.append(modelName);
+    builder.append(_38);
+    builder.append(fullName);
+    builder.append(_39);
+    builder.append(version);
+    builder.append(_40);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/PluginProperties.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/PluginProperties.java
new file mode 100644
index 0000000..5c018e3
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/PluginProperties.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class PluginProperties
+{
+  protected static String nl;
+  public static synchronized PluginProperties create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    PluginProperties result = new PluginProperties();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = " ";
+  protected static final String _2 = "#";
+  protected static final String _3 = "pluginName = ";
+  protected static final String _4 = "providerName = ";
+  protected final String _5 = "";
+  protected final String _6 = NL + _2 + NL + NL + _4;
+  protected final String _7 = NL + _3;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmLabel = jvm.getLabel();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+  String provider = model.getProvider();
+    builder.append(_5);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL));
+    builder.append(_6);
+    builder.append(provider);
+    builder.append(_7);
+    builder.append(modelLabel);
+    builder.append(_1);
+    builder.append(jvmLabel);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/ProjectXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/ProjectXML.java
new file mode 100644
index 0000000..ef8d20e
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/plugin/ProjectXML.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.plugin;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class ProjectXML
+{
+  protected static String nl;
+  public static synchronized ProjectXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    ProjectXML result = new ProjectXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = ".";
+  protected static final String _2 = "</arguments>";
+  protected static final String _3 = "</buildCommand>";
+  protected static final String _4 = "</buildSpec>";
+  protected static final String _5 = "</filter>";
+  protected static final String _6 = "</filteredResources>";
+  protected static final String _7 = "</matcher>";
+  protected static final String _8 = "</name>";
+  protected static final String _9 = "</natures>";
+  protected static final String _10 = "</projectDescription>";
+  protected static final String _11 = "</projects>";
+  protected static final String _12 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _13 = "<arguments>";
+  protected static final String _14 = "<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>";
+  protected static final String _15 = "<buildCommand>";
+  protected static final String _16 = "<buildSpec>";
+  protected static final String _17 = "<comment></comment>";
+  protected static final String _18 = "<filter>";
+  protected static final String _19 = "<filteredResources>";
+  protected static final String _20 = "<id>1396938000000</id>";
+  protected static final String _21 = "<id>org.eclipse.ui.ide.multiFilter</id>";
+  protected static final String _22 = "<matcher>";
+  protected static final String _23 = "<name>";
+  protected static final String _24 = "<name></name>";
+  protected static final String _25 = "<name>org.eclipse.pde.ManifestBuilder</name>";
+  protected static final String _26 = "<nature>org.eclipse.pde.PluginNature</nature>";
+  protected static final String _27 = "<natures>";
+  protected static final String _28 = "<projectDescription>";
+  protected static final String _29 = "<projects>";
+  protected static final String _30 = "<type>10</type>";
+  protected final String NL_1 = NL + "\t";
+  protected final String NL_2 = NL + "\t\t";
+  protected final String NL_3 = NL + "\t\t\t";
+  protected final String NL_4 = NL + "\t\t\t\t";
+  protected final String _31 = _12 + NL + _28 + NL_1 + _23;
+  protected final String _32 = _8 + NL_1 + _17 + NL_1 + _29 + NL_1 + _11 + NL_1 + _16 + NL_2 + _15 + NL_3 + _25 + NL_3 + _13 + NL_3 + _2 + NL_2 + _3 + NL_1 + _4 + NL_1 + _27 + NL_2 + _26 + NL_1 + _9 + NL_1 + _19 + NL_2 + _18 + NL_3 + _20 + NL_3 + _24 + NL_3 + _30 + NL_3 + _22 + NL_4 + _21 + NL_4 + _14 + NL_3 + _7 + NL_2 + _5 + NL_1 + _6 + NL + _10;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+    builder.append(_31);
+    builder.append(modelName);
+    builder.append(_1);
+    builder.append(jvmName);
+    builder.append(_32);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/POMXML.java
new file mode 100644
index 0000000..f5c7706
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/POMXML.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.parent;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = ".buildtime>";
+  protected static final String _3 = ".buildtime>true</";
+  protected static final String _4 = ".parent</artifactId>";
+  protected static final String _5 = ".site</module>";
+  protected static final String _6 = "<";
+  protected static final String _7 = "<!--";
+  protected static final String _8 = "<!--executionEnvironmentDefault>JavaSE-${javaVersion}</executionEnvironmentDefault-->";
+  protected static final String _9 = "</activation>";
+  protected static final String _10 = "</additionalFileSets>";
+  protected static final String _11 = "</build>";
+  protected static final String _12 = "</configuration>";
+  protected static final String _13 = "</dependencies>";
+  protected static final String _14 = "</dependency-resolution>";
+  protected static final String _15 = "</dependency>";
+  protected static final String _16 = "</environment>";
+  protected static final String _17 = "</environments>";
+  protected static final String _18 = "</extraRequirements>";
+  protected static final String _19 = "</fileSet>";
+  protected static final String _20 = "</groupId>";
+  protected static final String _21 = "</includes>";
+  protected static final String _22 = "</modules>";
+  protected static final String _23 = "</plugin>";
+  protected static final String _24 = "</pluginManagement>";
+  protected static final String _25 = "</pluginRepositories>";
+  protected static final String _26 = "</pluginRepository>";
+  protected static final String _27 = "</plugins>";
+  protected static final String _28 = "</profile>";
+  protected static final String _29 = "</profileProperties>";
+  protected static final String _30 = "</profiles>";
+  protected static final String _31 = "</project>";
+  protected static final String _32 = "</properties>";
+  protected static final String _33 = "</property>";
+  protected static final String _34 = "</repositories>";
+  protected static final String _35 = "</repository>";
+  protected static final String _36 = "</requirement>";
+  protected static final String _37 = "</sourceReferences>";
+  protected static final String _38 = "</target>";
+  protected static final String _39 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _40 = "<activation>";
+  protected static final String _41 = "<additionalFileSets>";
+  protected static final String _42 = "<arch>x86_64</arch>";
+  protected static final String _43 = "<artifactId>";
+  protected static final String _44 = "<artifactId>eclipse-jarsigner-plugin</artifactId>";
+  protected static final String _45 = "<artifactId>target-platform-configuration</artifactId>";
+  protected static final String _46 = "<artifactId>tycho-buildtimestamp-jgit</artifactId>";
+  protected static final String _47 = "<artifactId>tycho-maven-plugin</artifactId>";
+  protected static final String _48 = "<artifactId>tycho-p2-plugin</artifactId>";
+  protected static final String _49 = "<artifactId>tycho-p2-publisher-plugin</artifactId>";
+  protected static final String _50 = "<artifactId>tycho-pack200a-plugin</artifactId>";
+  protected static final String _51 = "<artifactId>tycho-pack200b-plugin</artifactId>";
+  protected static final String _52 = "<artifactId>tycho-packaging-plugin</artifactId>";
+  protected static final String _53 = "<artifactId>tycho-source-feature-plugin</artifactId>";
+  protected static final String _54 = "<artifactId>tycho-source-plugin</artifactId>";
+  protected static final String _55 = "<artifactId>tycho-sourceref-jgit</artifactId>";
+  protected static final String _56 = "<build>";
+  protected static final String _57 = "<configuration>";
+  protected static final String _58 = "<dependencies>";
+  protected static final String _59 = "<dependency-resolution>";
+  protected static final String _60 = "<dependency>";
+  protected static final String _61 = "<directory>${project.build.outputDirectory}</directory>";
+  protected static final String _62 = "<environment>";
+  protected static final String _63 = "<environments>";
+  protected static final String _64 = "<extensions>true</extensions>";
+  protected static final String _65 = "<extraRequirements>";
+  protected static final String _66 = "<fileSet>";
+  protected static final String _67 = "<format>'v'yyyyMMdd-HHmm</format>";
+  protected static final String _68 = "<generate>true</generate>";
+  protected static final String _69 = "<groupId>";
+  protected static final String _70 = "<groupId>org.eclipse.cbi.maven.plugins</groupId>";
+  protected static final String _71 = "<groupId>org.eclipse.tycho.extras</groupId>";
+  protected static final String _72 = "<groupId>org.eclipse.tycho</groupId>";
+  protected static final String _73 = "<id>eclipse-cbi-releases</id>";
+  protected static final String _74 = "<id>eclipse-maven-releases</id>";
+  protected static final String _75 = "<id>license-feature</id>";
+  protected static final String _76 = "<id>modules</id>";
+  protected static final String _77 = "<id>org.eclipse.license.feature.group</id>";
+  protected static final String _78 = "<include>about.mappings</include>";
+  protected static final String _79 = "<includePackedArtifacts>true</includePackedArtifacts>";
+  protected static final String _80 = "<includes>";
+  protected static final String _81 = "<jarsigner-version>1.1.7</jarsigner-version>";
+  protected static final String _82 = "<jgit.dirtyWorkingTree>warning</jgit.dirtyWorkingTree>";
+  protected static final String _83 = "<jgit.ignore>pom.xml</jgit.ignore>";
+  protected static final String _84 = "<layout>p2</layout>";
+  protected static final String _85 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _86 = "<module>../";
+  protected static final String _87 = "<module>features</module>";
+  protected static final String _88 = "<module>plugins</module>";
+  protected static final String _89 = "<modules>";
+  protected static final String _90 = "<name>MAVEN_BUILD</name>";
+  protected static final String _91 = "<os-jvm-flags/>";
+  protected static final String _92 = "<os>linux</os>";
+  protected static final String _93 = "<os>macosx</os>";
+  protected static final String _94 = "<os>win32</os>";
+  protected static final String _95 = "<packaging>pom</packaging>";
+  protected static final String _96 = "<plugin>";
+  protected static final String _97 = "<pluginManagement>";
+  protected static final String _98 = "<pluginRepositories>";
+  protected static final String _99 = "<pluginRepository>";
+  protected static final String _100 = "<plugins>";
+  protected static final String _101 = "<profile>";
+  protected static final String _102 = "<profileProperties>";
+  protected static final String _103 = "<profiles>";
+  protected static final String _104 = "<project";
+  protected static final String _105 = "<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>";
+  protected static final String _106 = "<properties>";
+  protected static final String _107 = "<property>";
+  protected static final String _108 = "<repositories>";
+  protected static final String _109 = "<repository>";
+  protected static final String _110 = "<requirement>";
+  protected static final String _111 = "<skip>true</skip>";
+  protected static final String _112 = "<sourceReferences>";
+  protected static final String _113 = "<target>";
+  protected static final String _114 = "<timestampProvider>jgit</timestampProvider>";
+  protected static final String _115 = "<tycho-version>1.6.0</tycho-version>";
+  protected static final String _116 = "<tycho.scmUrl>scm:git:https://git.eclipse.org/r/p/justj/org.eclipse.justj.git</tycho.scmUrl>";
+  protected static final String _117 = "<type>p2-installable-unit</type>";
+  protected static final String _118 = "<url>http://download.eclipse.org/cbi/updates/license/</url>";
+  protected static final String _119 = "<url>https://repo.eclipse.org/content/repositories/cbi-releases</url>";
+  protected static final String _120 = "<url>https://repo.eclipse.org/content/repositories/releases</url>";
+  protected static final String _121 = "<value>!false</value>";
+  protected static final String _122 = "<version>${jarsigner-version}</version>";
+  protected static final String _123 = "<version>${tycho-version}</version>";
+  protected static final String _124 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _125 = "<versionRange>0.0.0</versionRange>";
+  protected static final String _126 = "<ws>cocoa</ws>";
+  protected static final String _127 = "<ws>gtk</ws>";
+  protected static final String _128 = "<ws>win32</ws>";
+  protected static final String _129 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _130 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _131 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String NL_3 = NL + "      ";
+  protected final String NL_4 = NL + "        ";
+  protected final String NL_5 = NL + "          ";
+  protected final String NL_6 = NL + "            ";
+  protected final String NL_7 = NL + "              ";
+  protected final String NL_8 = NL + "                ";
+  protected final String NL_9 = NL + "                  ";
+  protected final String NL_10 = NL + "                    ";
+  protected final String _132 = NL + _1 + NL + _104 + NL_2 + _130 + NL_2 + _129 + NL_2 + _131 + NL_1 + _85 + NL + NL_1 + _69;
+  protected final String _133 = _20 + NL_1 + _43;
+  protected final String _134 = _4 + NL_1 + _124 + NL_1 + _95 + NL + NL_1 + _106 + NL_2 + _105 + NL_2 + _116 + NL_2 + _115 + NL_2 + _81 + NL_2 + _91 + NL_1 + _32 + NL + NL_1 + _98 + NL_2 + _99 + NL_3 + _74 + NL_3 + _120 + NL_2 + _26 + NL_2 + _99 + NL_3 + _73 + NL_3 + _119 + NL_2 + _26 + NL_1 + _25 + NL + NL_1 + _108 + NL_2 + _109 + NL_3 + _75 + NL_3 + _118 + NL_3 + _84 + NL_2 + _35 + NL_1 + _34 + NL + NL_1 + _56 + NL_2 + _100 + NL_3 + _96 + NL_4 + _72 + NL_4 + _47 + NL_4 + _64 + NL_3 + _23 + NL_3 + _96 + NL_4 + _72 + NL_4 + _49 + NL_4 + _123 + NL_4 + _57 + NL_5 + _111 + NL_4 + _12 + NL_3 + _23 + NL_2 + _27 + NL_2 + _97 + NL_3 + _100 + NL_4 + _96 + NL_5 + _72 + NL_5 + _47 + NL_5 + _123 + NL_5 + _64 + NL_4 + _23 + NL_4 + _96 + NL_5 + _72 + NL_5 + _52 + NL_5 + _123 + NL_5 + _57 + NL_6 + _67 + NL_6 + _112 + NL_7 + _68 + NL_6 + _37 + NL_6 + _114 + NL_6 + _83 + NL_6 + _82 + NL_6 + _41 + NL_7 + _66 + NL_8 + _61 + NL_8 + _80 + NL_9 + _78 + NL_8 + _21 + NL_7 + _19 + NL_6 + _10 + NL_5 + _12 + NL_5 + _58 + NL_6 + _60 + NL_7 + _71 + NL_7 + _55 + NL_7 + _123 + NL_6 + _15 + NL_6 + _60 + NL_7 + _71 + NL_7 + _46 + NL_7 + _123 + NL_6 + _15 + NL_5 + _13 + NL_4 + _23 + NL_5 + _96 + NL_6 + _72 + NL_6 + _45 + NL_6 + _123 + NL_6 + _57 + NL_7 + _113 + NL_7 + _38 + NL + NL_7 + _8 + NL_7 + _79 + NL_7 + _63 + NL_8 + _62 + NL_9 + _94 + NL_9 + _128 + NL_9 + _42 + NL_8 + _16 + NL_8 + _62 + NL_9 + _93 + NL_9 + _126 + NL_9 + _42 + NL_8 + _16 + NL_8 + _62 + NL_9 + _92 + NL_9 + _127 + NL_9 + _42 + NL_8 + _16 + NL_7 + _17 + NL_7 + _59 + NL_8 + _65 + NL_9 + _110 + NL_10 + _117 + NL_10 + _77 + NL_10 + _125 + NL_9 + _36 + NL_8 + _18 + NL_8 + _102 + NL_9 + _6;
+  protected final String _135 = _2 + NL_8 + _29 + NL_7 + _14 + NL_6 + _12 + NL_5 + _23 + NL_4 + _96 + NL_5 + _72 + NL_5 + _54 + NL_5 + _123 + NL_4 + _23 + NL_4 + _96 + NL_5 + _71 + NL_5 + _50 + NL_5 + _123 + NL_4 + _23 + NL_4 + _96 + NL_5 + _70 + NL_5 + _44 + NL_5 + _122 + NL_4 + _23 + NL_4 + _96 + NL_5 + _71 + NL_5 + _51 + NL_5 + _123 + NL_4 + _23 + NL_4 + _96 + NL_5 + _72 + NL_5 + _48 + NL_5 + _123 + NL_4 + _23 + NL_4 + _96 + NL_5 + _71 + NL_5 + _53 + NL_5 + _123 + NL_4 + _23 + NL_3 + _27 + NL_2 + _24 + NL_1 + _11 + NL + NL_1 + _103 + NL_2 + _101 + NL_3 + _76 + NL_3 + _40 + NL_4 + _107 + NL_5 + _90 + NL_5 + _121 + NL_4 + _33 + NL_3 + _9 + NL_3 + _89 + NL_4 + _87 + NL_4 + _88 + NL_4 + _86;
+  protected final String _136 = _5 + NL_3 + _22 + NL_2 + _28 + NL_1 + _30 + NL + NL + _31;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+    builder.append(_39);
+    builder.append(NL);
+    builder.append(_7);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_132);
+    builder.append(name);
+    builder.append(_133);
+    builder.append(name);
+    builder.append(_134);
+    builder.append(name);
+    builder.append(_3);
+    builder.append(name);
+    builder.append(_135);
+    builder.append(name);
+    builder.append(_136);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/ProjectXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/ProjectXML.java
new file mode 100644
index 0000000..f358824
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/ProjectXML.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.parent;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class ProjectXML
+{
+  protected static String nl;
+  public static synchronized ProjectXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    ProjectXML result = new ProjectXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = ".parent</name>";
+  protected static final String _2 = "</buildSpec>";
+  protected static final String _3 = "</filter>";
+  protected static final String _4 = "</filteredResources>";
+  protected static final String _5 = "</matcher>";
+  protected static final String _6 = "</natures>";
+  protected static final String _7 = "</projectDescription>";
+  protected static final String _8 = "</projects>";
+  protected static final String _9 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _10 = "<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>";
+  protected static final String _11 = "<buildSpec>";
+  protected static final String _12 = "<comment></comment>";
+  protected static final String _13 = "<filter>";
+  protected static final String _14 = "<filteredResources>";
+  protected static final String _15 = "<id>1396938000000</id>";
+  protected static final String _16 = "<id>org.eclipse.ui.ide.multiFilter</id>";
+  protected static final String _17 = "<matcher>";
+  protected static final String _18 = "<name>";
+  protected static final String _19 = "<name></name>";
+  protected static final String _20 = "<natures>";
+  protected static final String _21 = "<projectDescription>";
+  protected static final String _22 = "<projects>";
+  protected static final String _23 = "<type>10</type>";
+  protected final String NL_1 = NL + "\t";
+  protected final String NL_2 = NL + "\t\t";
+  protected final String NL_3 = NL + "\t\t\t";
+  protected final String NL_4 = NL + "\t\t\t\t";
+  protected final String _24 = _9 + NL + _21 + NL_1 + _18;
+  protected final String _25 = _1 + NL_1 + _12 + NL_1 + _22 + NL_1 + _8 + NL_1 + _11 + NL_1 + _2 + NL_1 + _20 + NL_1 + _6 + NL_1 + _14 + NL_2 + _13 + NL_3 + _15 + NL_3 + _19 + NL_3 + _23 + NL_3 + _17 + NL_4 + _16 + NL_4 + _10 + NL_3 + _5 + NL_2 + _3 + NL_1 + _4 + NL + _7;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+    builder.append(_24);
+    builder.append(name);
+    builder.append(_25);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/features/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/features/POMXML.java
new file mode 100644
index 0000000..b1b5344
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/features/POMXML.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.parent.features;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = "-feature</module>";
+  protected static final String _3 = ".";
+  protected static final String _4 = ".features</artifactId>";
+  protected static final String _5 = ".parent</artifactId>";
+  protected static final String _6 = "<!--";
+  protected static final String _7 = "</activation>";
+  protected static final String _8 = "</build>";
+  protected static final String _9 = "</configuration>";
+  protected static final String _10 = "</execution>";
+  protected static final String _11 = "</executions>";
+  protected static final String _12 = "</goals>";
+  protected static final String _13 = "</groupId>";
+  protected static final String _14 = "</modules>";
+  protected static final String _15 = "</parent>";
+  protected static final String _16 = "</plugin>";
+  protected static final String _17 = "</plugins>";
+  protected static final String _18 = "</profile>";
+  protected static final String _19 = "</profiles>";
+  protected static final String _20 = "</project>";
+  protected static final String _21 = "</property>";
+  protected static final String _22 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _23 = "<activation>";
+  protected static final String _24 = "<artifactId>";
+  protected static final String _25 = "<artifactId>eclipse-jarsigner-plugin</artifactId>";
+  protected static final String _26 = "<artifactId>tycho-p2-plugin</artifactId>";
+  protected static final String _27 = "<attachP2Metadata>false</attachP2Metadata>";
+  protected static final String _28 = "<build>";
+  protected static final String _29 = "<configuration>";
+  protected static final String _30 = "<execution>";
+  protected static final String _31 = "<executions>";
+  protected static final String _32 = "<goal>p2-metadata</goal>";
+  protected static final String _33 = "<goal>sign</goal>";
+  protected static final String _34 = "<goals>";
+  protected static final String _35 = "<groupId>";
+  protected static final String _36 = "<groupId>org.eclipse.cbi.maven.plugins</groupId>";
+  protected static final String _37 = "<groupId>org.eclipse.tycho</groupId>";
+  protected static final String _38 = "<id>attach-p2-metadata</id>";
+  protected static final String _39 = "<id>default-p2-metadata-default</id>";
+  protected static final String _40 = "<id>pack-and-sign</id>";
+  protected static final String _41 = "<id>sign</id>";
+  protected static final String _42 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _43 = "<module>../../../features/";
+  protected static final String _44 = "<modules>";
+  protected static final String _45 = "<name>PACK_AND_SIGN</name>";
+  protected static final String _46 = "<packaging>pom</packaging>";
+  protected static final String _47 = "<parent>";
+  protected static final String _48 = "<phase>package</phase>";
+  protected static final String _49 = "<plugin>";
+  protected static final String _50 = "<plugins>";
+  protected static final String _51 = "<profile>";
+  protected static final String _52 = "<profiles>";
+  protected static final String _53 = "<project";
+  protected static final String _54 = "<property>";
+  protected static final String _55 = "<relativePath>..</relativePath>";
+  protected static final String _56 = "<value>true</value>";
+  protected static final String _57 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _58 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _59 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _60 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String NL_3 = NL + "      ";
+  protected final String NL_4 = NL + "        ";
+  protected final String NL_5 = NL + "          ";
+  protected final String NL_6 = NL + "            ";
+  protected final String NL_7 = NL + "              ";
+  protected final String NL_8 = NL + "                ";
+  protected final String NL_9 = NL + "                  ";
+  protected final String _61 = NL + _1 + NL + _53 + NL_2 + _59 + NL_2 + _58 + NL_2 + _60 + NL_1 + _42 + NL + NL_1 + _47 + NL_2 + _35;
+  protected final String _62 = _13 + NL_2 + _24;
+  protected final String _63 = _5 + NL_2 + _57 + NL_2 + _55 + NL_1 + _15 + NL + NL_1 + _35;
+  protected final String _64 = _13 + NL_1 + _24;
+  protected final String _65 = _4 + NL_1 + _57 + NL_1 + _46 + NL + NL_1 + _44;
+  protected final String _66 = NL_2 + _43;
+  protected final String _67 = NL_1 + _14 + NL + NL_1 + _28 + NL_2 + _50 + NL_3 + _49 + NL_4 + _37 + NL_4 + _26 + NL_4 + _31 + NL_5 + _30 + NL_6 + _39 + NL_6 + _29 + NL_7 + _27 + NL_6 + _9 + NL_5 + _10 + NL_5 + _30 + NL_6 + _38 + NL_6 + _48 + NL_6 + _34 + NL_7 + _32 + NL_6 + _12 + NL_5 + _10 + NL_4 + _11 + NL_3 + _16 + NL_2 + _17 + NL_1 + _8 + NL + NL_1 + _52 + NL_2 + _51 + NL_3 + _40 + NL_3 + _23 + NL_4 + _54 + NL_5 + _45 + NL_5 + _56 + NL_4 + _21 + NL_3 + _7 + NL_3 + _28 + NL_4 + _50 + NL_5 + _49 + NL_6 + _36 + NL_6 + _25 + NL_6 + _31 + NL_7 + _30 + NL_8 + _41 + NL_8 + _34 + NL_9 + _33 + NL_8 + _12 + NL_7 + _10 + NL_6 + _11 + NL_5 + _16 + NL_5 + _49 + NL_6 + _37 + NL_6 + _26 + NL_5 + _16 + NL_4 + _17 + NL_3 + _8 + NL_2 + _18 + NL_1 + _19 + NL + NL + _20;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+    builder.append(_22);
+    builder.append(NL);
+    builder.append(_6);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_61);
+    builder.append(name);
+    builder.append(_62);
+    builder.append(name);
+    builder.append(_63);
+    builder.append(name);
+    builder.append(_64);
+    builder.append(name);
+    builder.append(_65);
+    for (JVM jvm : model.getJVMs()) {
+    builder.append(_66);
+    builder.append(name);
+    builder.append(_3);
+    builder.append(jvm.getName());
+    builder.append(_2);
+    }
+    builder.append(_67);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/plugins/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/plugins/POMXML.java
new file mode 100644
index 0000000..40f9009
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/parent/plugins/POMXML.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.parent.plugins;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = ".";
+  protected static final String _3 = ".parent</artifactId>";
+  protected static final String _4 = ".plugins</artifactId>";
+  protected static final String _5 = "<!--";
+  protected static final String _6 = "</activation>";
+  protected static final String _7 = "</build>";
+  protected static final String _8 = "</configuration>";
+  protected static final String _9 = "</execution>";
+  protected static final String _10 = "</executions>";
+  protected static final String _11 = "</goals>";
+  protected static final String _12 = "</groupId>";
+  protected static final String _13 = "</module>";
+  protected static final String _14 = "</modules>";
+  protected static final String _15 = "</parent>";
+  protected static final String _16 = "</plugin>";
+  protected static final String _17 = "</plugins>";
+  protected static final String _18 = "</profile>";
+  protected static final String _19 = "</profiles>";
+  protected static final String _20 = "</project>";
+  protected static final String _21 = "</property>";
+  protected static final String _22 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _23 = "<activation>";
+  protected static final String _24 = "<artifactId>";
+  protected static final String _25 = "<artifactId>eclipse-jarsigner-plugin</artifactId>";
+  protected static final String _26 = "<artifactId>tycho-p2-plugin</artifactId>";
+  protected static final String _27 = "<artifactId>tycho-pack200a-plugin</artifactId>";
+  protected static final String _28 = "<artifactId>tycho-pack200b-plugin</artifactId>";
+  protected static final String _29 = "<artifactId>tycho-source-plugin</artifactId>";
+  protected static final String _30 = "<build>";
+  protected static final String _31 = "<configuration>";
+  protected static final String _32 = "<defaultP2Metadata>false</defaultP2Metadata>";
+  protected static final String _33 = "<execution>";
+  protected static final String _34 = "<executions>";
+  protected static final String _35 = "<goal>normalize</goal>";
+  protected static final String _36 = "<goal>p2-metadata</goal>";
+  protected static final String _37 = "<goal>pack</goal>";
+  protected static final String _38 = "<goal>plugin-source</goal>";
+  protected static final String _39 = "<goal>sign</goal>";
+  protected static final String _40 = "<goals>";
+  protected static final String _41 = "<groupId>";
+  protected static final String _42 = "<groupId>org.eclipse.cbi.maven.plugins</groupId>";
+  protected static final String _43 = "<groupId>org.eclipse.tycho.extras</groupId>";
+  protected static final String _44 = "<groupId>org.eclipse.tycho</groupId>";
+  protected static final String _45 = "<id>attach-p2-metadata</id>";
+  protected static final String _46 = "<id>attach-source</id>";
+  protected static final String _47 = "<id>pack-and-sign</id>";
+  protected static final String _48 = "<id>pack200-normalize</id>";
+  protected static final String _49 = "<id>pack200-pack</id>";
+  protected static final String _50 = "<id>sign</id>";
+  protected static final String _51 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _52 = "<module>../../../plugins/";
+  protected static final String _53 = "<modules>";
+  protected static final String _54 = "<name>PACK_AND_SIGN</name>";
+  protected static final String _55 = "<packaging>pom</packaging>";
+  protected static final String _56 = "<parent>";
+  protected static final String _57 = "<phase>package</phase>";
+  protected static final String _58 = "<plugin>";
+  protected static final String _59 = "<plugins>";
+  protected static final String _60 = "<profile>";
+  protected static final String _61 = "<profiles>";
+  protected static final String _62 = "<project";
+  protected static final String _63 = "<property>";
+  protected static final String _64 = "<relativePath>..</relativePath>";
+  protected static final String _65 = "<value>true</value>";
+  protected static final String _66 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _67 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _68 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _69 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String NL_3 = NL + "      ";
+  protected final String NL_4 = NL + "        ";
+  protected final String NL_5 = NL + "          ";
+  protected final String NL_6 = NL + "            ";
+  protected final String NL_7 = NL + "              ";
+  protected final String NL_8 = NL + "                ";
+  protected final String NL_9 = NL + "                  ";
+  protected final String _70 = NL + _1 + NL + _62 + NL_2 + _68 + NL_2 + _67 + NL_2 + _69 + NL_1 + _51 + NL + NL_1 + _56 + NL_2 + _41;
+  protected final String _71 = _12 + NL_2 + _24;
+  protected final String _72 = _3 + NL_2 + _66 + NL_2 + _64 + NL_1 + _15 + NL + NL_1 + _41;
+  protected final String _73 = _12 + NL_1 + _24;
+  protected final String _74 = _4 + NL_1 + _66 + NL_1 + _55 + NL + NL_1 + _53;
+  protected final String _75 = NL_2 + _52;
+  protected final String _76 = NL_1 + _14 + NL + NL_1 + _30 + NL_2 + _59 + NL_3 + _58 + NL_4 + _44 + NL_4 + _29 + NL_4 + _34 + NL_5 + _33 + NL_6 + _46 + NL_6 + _40 + NL_7 + _38 + NL_6 + _11 + NL_5 + _9 + NL_4 + _10 + NL_3 + _16 + NL_2 + _17 + NL_1 + _7 + NL + NL_1 + _61 + NL_2 + _60 + NL_3 + _47 + NL_3 + _23 + NL_4 + _63 + NL_5 + _54 + NL_5 + _65 + NL_4 + _21 + NL_3 + _6 + NL_3 + _30 + NL_4 + _59 + NL_5 + _58 + NL_6 + _43 + NL_6 + _27 + NL_6 + _34 + NL_7 + _33 + NL_8 + _48 + NL_8 + _40 + NL_9 + _35 + NL_8 + _11 + NL_7 + _9 + NL_6 + _10 + NL_5 + _16 + NL_5 + _58 + NL_6 + _42 + NL_6 + _25 + NL_6 + _34 + NL_7 + _33 + NL_8 + _50 + NL_8 + _40 + NL_9 + _39 + NL_8 + _11 + NL_7 + _9 + NL_6 + _10 + NL_5 + _16 + NL_5 + _58 + NL_6 + _43 + NL_6 + _28 + NL_6 + _34 + NL_7 + _33 + NL_8 + _49 + NL_8 + _40 + NL_9 + _37 + NL_8 + _11 + NL_7 + _9 + NL_6 + _10 + NL_5 + _16 + NL_5 + _58 + NL_6 + _44 + NL_6 + _26 + NL_6 + _34 + NL_7 + _33 + NL_8 + _45 + NL_8 + _57 + NL_8 + _40 + NL_9 + _36 + NL_8 + _11 + NL_7 + _9 + NL_6 + _10 + NL_6 + _31 + NL_7 + _32 + NL_6 + _8 + NL_5 + _16 + NL_4 + _17 + NL_3 + _7 + NL_2 + _18 + NL_1 + _19 + NL + NL + _20;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+    builder.append(_22);
+    builder.append(NL);
+    builder.append(_5);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_70);
+    builder.append(name);
+    builder.append(_71);
+    builder.append(name);
+    builder.append(_72);
+    builder.append(name);
+    builder.append(_73);
+    builder.append(name);
+    builder.append(_74);
+    for (JVM jvm : model.getJVMs()) {
+    builder.append(_75);
+    builder.append(name);
+    builder.append(_2);
+    builder.append(jvm.getName());
+    builder.append(_13);
+    for (Variant variant : jvm.getVariants()) {
+    builder.append(_75);
+    builder.append(name);
+    builder.append(_2);
+    builder.append(jvm.getName());
+    builder.append(_2);
+    builder.append(variant.getOs());
+    builder.append(_2);
+    builder.append(variant.getArch());
+    builder.append(_13);
+    }
+    }
+    builder.append(_76);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/CategoryXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/CategoryXML.java
new file mode 100644
index 0000000..5563c2f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/CategoryXML.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.site;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class CategoryXML
+{
+  protected static String nl;
+  public static synchronized CategoryXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    CategoryXML result = new CategoryXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = "-->";
+  protected static final String _2 = ".";
+  protected static final String _3 = ".category\" label=\"";
+  protected static final String _4 = ".category\"/>";
+  protected static final String _5 = "<!--";
+  protected static final String _6 = "</feature>";
+  protected static final String _7 = "</site>";
+  protected static final String _8 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _9 = "<category name=\"";
+  protected static final String _10 = "<category-def name=\"";
+  protected static final String _11 = "<feature id=\"";
+  protected static final String _12 = "<site>";
+  protected static final String _13 = "\"/>";
+  protected static final String _14 = "\">";
+  protected final String NL_1 = NL + "   ";
+  protected final String NL_2 = NL + "      ";
+  protected final String _15 = NL + _1 + NL + _12;
+  protected final String _16 = NL_1 + _11;
+  protected final String _17 = _14 + NL_2 + _9;
+  protected final String _18 = _4 + NL_1 + _6;
+  protected final String _19 = NL_1 + _10;
+  protected final String _20 = _13 + NL + _7;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+  String label = model.getLabel();
+    builder.append(_8);
+    builder.append(NL);
+    builder.append(_5);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_15);
+    for (JVM jvm : model.getJVMs()) {
+    builder.append(_16);
+    builder.append(name);
+    builder.append(_2);
+    builder.append(jvm.getName());
+    builder.append(_17);
+    builder.append(name);
+    builder.append(_18);
+    }
+    builder.append(_19);
+    builder.append(name);
+    builder.append(_3);
+    builder.append(label);
+    builder.append(_20);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/POMXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/POMXML.java
new file mode 100644
index 0000000..c8105d1
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/POMXML.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.site;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class POMXML
+{
+  protected static String nl;
+  public static synchronized POMXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    POMXML result = new POMXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = " Build ${build.id}</repositoryName>";
+  protected static final String _2 = "-->";
+  protected static final String _3 = ".parent</artifactId>";
+  protected static final String _4 = ".parent</relativePath>";
+  protected static final String _5 = ".site</artifactId>";
+  protected static final String _6 = "<!--";
+  protected static final String _7 = "</build>";
+  protected static final String _8 = "</configuration>";
+  protected static final String _9 = "</groupId>";
+  protected static final String _10 = "</parent>";
+  protected static final String _11 = "</plugin>";
+  protected static final String _12 = "</plugins>";
+  protected static final String _13 = "</project>";
+  protected static final String _14 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _15 = "<artifactId>";
+  protected static final String _16 = "<artifactId>tycho-p2-repository-plugin</artifactId>";
+  protected static final String _17 = "<build>";
+  protected static final String _18 = "<configuration>";
+  protected static final String _19 = "<groupId>";
+  protected static final String _20 = "<groupId>org.eclipse.tycho</groupId>";
+  protected static final String _21 = "<modelVersion>4.0.0</modelVersion>";
+  protected static final String _22 = "<packaging>eclipse-repository</packaging>";
+  protected static final String _23 = "<parent>";
+  protected static final String _24 = "<plugin>";
+  protected static final String _25 = "<plugins>";
+  protected static final String _26 = "<project";
+  protected static final String _27 = "<relativePath>../";
+  protected static final String _28 = "<repositoryName>";
+  protected static final String _29 = "<version>${tycho-version}</version>";
+  protected static final String _30 = "<version>1.0.0-SNAPSHOT</version>";
+  protected static final String _31 = "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+  protected static final String _32 = "xmlns=\"http://maven.apache.org/POM/4.0.0\"";
+  protected static final String _33 = "xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">";
+  protected final String NL_1 = NL + "  ";
+  protected final String NL_2 = NL + "    ";
+  protected final String NL_3 = NL + "      ";
+  protected final String NL_4 = NL + "         ";
+  protected final String NL_5 = NL + "            ";
+  protected final String _34 = NL + _2 + NL + _26 + NL_2 + _32 + NL_2 + _31 + NL_2 + _33 + NL_1 + _21 + NL + NL_1 + _23 + NL_2 + _19;
+  protected final String _35 = _9 + NL_2 + _15;
+  protected final String _36 = _3 + NL_2 + _30 + NL_2 + _27;
+  protected final String _37 = _4 + NL_1 + _10 + NL + NL_1 + _19;
+  protected final String _38 = _9 + NL_1 + _15;
+  protected final String _39 = _5 + NL_1 + _30 + NL_1 + _22 + NL + NL_1 + _17 + NL_2 + _25 + NL_3 + _24 + NL_4 + _20 + NL_4 + _16 + NL_4 + _29 + NL_4 + _18 + NL_5 + _28;
+  protected final String _40 = _1 + NL_4 + _8 + NL_3 + _11 + NL_2 + _12 + NL_1 + _7 + NL + _13;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+  String label = model.getLabel();
+    builder.append(_14);
+    builder.append(NL);
+    builder.append(_6);
+    builder.append(NL);
+    builder.append(org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL));
+    builder.append(_34);
+    builder.append(name);
+    builder.append(_35);
+    builder.append(name);
+    builder.append(_36);
+    builder.append(name);
+    builder.append(_37);
+    builder.append(name);
+    builder.append(_38);
+    builder.append(name);
+    builder.append(_39);
+    builder.append(label);
+    builder.append(_40);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/ProjectXML.java b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/ProjectXML.java
new file mode 100644
index 0000000..4f5578f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/src/org/eclipse/justj/codegen/templates/releng/site/ProjectXML.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2020 Eclipse contributors and others.
+ * 
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ */
+package org.eclipse.justj.codegen.templates.releng.site;
+
+import org.eclipse.justj.codegen.model.*;
+
+public class ProjectXML
+{
+  protected static String nl;
+  public static synchronized ProjectXML create(String lineSeparator)
+  {
+    nl = lineSeparator;
+    ProjectXML result = new ProjectXML();
+    nl = null;
+    return result;
+  }
+
+  public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
+  protected static final String _1 = ".site</name>";
+  protected static final String _2 = "</buildSpec>";
+  protected static final String _3 = "</filter>";
+  protected static final String _4 = "</filteredResources>";
+  protected static final String _5 = "</matcher>";
+  protected static final String _6 = "</natures>";
+  protected static final String _7 = "</projectDescription>";
+  protected static final String _8 = "</projects>";
+  protected static final String _9 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+  protected static final String _10 = "<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>";
+  protected static final String _11 = "<buildSpec>";
+  protected static final String _12 = "<comment></comment>";
+  protected static final String _13 = "<filter>";
+  protected static final String _14 = "<filteredResources>";
+  protected static final String _15 = "<id>1396938000000</id>";
+  protected static final String _16 = "<id>org.eclipse.ui.ide.multiFilter</id>";
+  protected static final String _17 = "<matcher>";
+  protected static final String _18 = "<name>";
+  protected static final String _19 = "<name></name>";
+  protected static final String _20 = "<natures>";
+  protected static final String _21 = "<projectDescription>";
+  protected static final String _22 = "<projects>";
+  protected static final String _23 = "<type>10</type>";
+  protected final String NL_1 = NL + "\t";
+  protected final String NL_2 = NL + "\t\t";
+  protected final String NL_3 = NL + "\t\t\t";
+  protected final String NL_4 = NL + "\t\t\t\t";
+  protected final String _24 = _9 + NL + _21 + NL_1 + _18;
+  protected final String _25 = _1 + NL_1 + _12 + NL_1 + _22 + NL_1 + _8 + NL_1 + _11 + NL_1 + _2 + NL_1 + _20 + NL_1 + _6 + NL_1 + _14 + NL_2 + _13 + NL_3 + _15 + NL_3 + _19 + NL_3 + _23 + NL_3 + _17 + NL_4 + _16 + NL_4 + _10 + NL_3 + _5 + NL_2 + _3 + NL_1 + _4 + NL + _7;
+
+  public String generate(Object argument)
+  {
+    final StringBuilder builder = new StringBuilder();
+    Model model = (Model)argument;
+  String name = model.getName();
+    builder.append(_24);
+    builder.append(name);
+    builder.append(_25);
+    builder.append(NL);
+    return builder.toString();
+  }
+}
diff --git a/plugins/org.eclipse.justj.codegen/templates/copyright.properties.jetinc b/plugins/org.eclipse.justj.codegen/templates/copyright.properties.jetinc
new file mode 100644
index 0000000..66ef41b
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/copyright.properties.jetinc
@@ -0,0 +1,2 @@
+<%=org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "# ", NL)%>
+#
diff --git a/plugins/org.eclipse.justj.codegen/templates/copyright.xml.jetinc b/plugins/org.eclipse.justj.codegen/templates/copyright.xml.jetinc
new file mode 100644
index 0000000..008c667
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/copyright.xml.jetinc
@@ -0,0 +1,3 @@
+<!--
+<%=org.eclipse.justj.codegen.model.util.Generator.getCopyright(argument, "", NL)%>
+-->
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.codegen/templates/dot.gitignore.jet b/plugins/org.eclipse.justj.codegen/templates/dot.gitignore.jet
new file mode 100644
index 0000000..99801f6
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/dot.gitignore.jet
@@ -0,0 +1,12 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates" class="GitIgnore" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+target/
diff --git a/plugins/org.eclipse.justj.codegen/templates/feature/build.properties.jet b/plugins/org.eclipse.justj.codegen/templates/feature/build.properties.jet
new file mode 100644
index 0000000..ede122b
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/feature/build.properties.jet
@@ -0,0 +1,15 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.feature" class="BuildProperties" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%@include file="../copyright.properties.jetinc"%>
+
+bin.includes = feature.xml,\
+               feature.properties
diff --git a/plugins/org.eclipse.justj.codegen/templates/feature/dot.project.jet b/plugins/org.eclipse.justj.codegen/templates/feature/dot.project.jet
new file mode 100644
index 0000000..fa8d01c
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/feature/dot.project.jet
@@ -0,0 +1,40 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.feature" class="ProjectXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name><%=modelName%>.<%=jvmName%>-feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen/templates/feature/feature.properties.jet b/plugins/org.eclipse.justj.codegen/templates/feature/feature.properties.jet
new file mode 100644
index 0000000..9741a4f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/feature/feature.properties.jet
@@ -0,0 +1,22 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.feature" class="FeatureProperties" imports="org.eclipse.justj.codegen.model.* org.eclipse.justj.codegen.model.util.Generator" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmLabel = jvm.getLabel();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+  String provider = model.getProvider();%>
+<%@include file="../copyright.properties.jetinc"%>
+
+providerName = <%=provider%>
+featureName = <%=modelLabel%> <%=jvmLabel%>
+description = Contains the plug-ins and fragments for the <%=jvmLabel%>
+copyright = <%=Generator.getCopyright(argument, "", "\\n\\" + NL)%>\n
diff --git a/plugins/org.eclipse.justj.codegen/templates/feature/feature.xml.jet b/plugins/org.eclipse.justj.codegen/templates/feature/feature.xml.jet
new file mode 100644
index 0000000..c03fb2f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/feature/feature.xml.jet
@@ -0,0 +1,60 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.feature" class="FeatureXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../copyright.xml.jetinc"%>
+<feature
+      id="<%=fullName%>"
+      label="%featureName"
+      version="<%=version%>.qualifier"
+      provider-name="%providerName"
+      license-feature="org.eclipse.license"
+      license-feature-version="0.0.0">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <plugin
+         id="<%=fullName%>"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+<%for (Variant variant : jvm.getVariants()) {
+    String os = variant.getOs();
+    String arch = variant.getArch();%>
+   <plugin
+         id="<%=fullName%>.<%=os%>.<%=arch%>"
+         os="<%=os%>"
+         arch="<%=arch%>"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         fragment="true"/>
+
+<%}%>
+</feature>
diff --git a/plugins/org.eclipse.justj.codegen/templates/feature/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/feature/pom.xml.jet
new file mode 100644
index 0000000..c57b0e6
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/feature/pom.xml.jet
@@ -0,0 +1,37 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.feature" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId><%=modelName%></groupId>
+    <artifactId><%=modelName%>.features</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/<%=modelName%>.parent/features</relativePath>
+  </parent>
+
+  <groupId><%=modelName%>.features</groupId>
+  <artifactId><%=fullName%></artifactId>
+  <version><%=version%>-SNAPSHOT</version>
+  <packaging>eclipse-feature</packaging>
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/MANIFEST.MF.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/MANIFEST.MF.jet
new file mode 100644
index 0000000..1052edc
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/MANIFEST.MF.jet
@@ -0,0 +1,30 @@
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="Manifest" imports="java.util.Iterator java.util.Map.Entry java.util.Set org.eclipse.justj.codegen.model.* org.eclipse.justj.codegen.model.util.Generator" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Variant variant = (Variant)argument;
+  String os = variant.getOs();
+  String arch = variant.getArch();
+  JVM jvm = variant.getJVM();
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String hostName = modelName + '.' + jvmName;
+  String fullName = hostName + '.' + os + '.' + arch;
+  String version = jvm.getVersion();%>
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: <%=fullName%>;singleton:=true
+Bundle-Version: <%=version%>.qualifier
+Bundle-Localization: fragment
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Fragment-Host: <%=hostName%>;bundle-version="<%=Generator.getVersionRange(version)%>"
+Eclipse-BundleShape: dir
+Eclipse-PlatformFilter: (& (osgi.os=<%=os%>) (osgi.arch=<%=arch%>))
+Automatic-Module-Name: <%=fullName%>
+Provide-Capability: <%%>
+<%for (Iterator<Entry<String, Set<String>>> it = Generator.getEECapabilities(version).entrySet().iterator(); it.hasNext();) {
+    Entry<String, Set<String>> entry = it.next();%>
+  <%for (Iterator<String> it2 = entry.getValue().iterator(); it2.hasNext();) {
+      String eeVersion = it2.next();%>
+ osgi.ee;osgi.ee="<%=entry.getKey()%>";version:Version="<%=eeVersion%>"<%if (it.hasNext() || it2.hasNext()) {%>,<%}%>
+  <%}%>
+<%}%>
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/about.mappings.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/about.mappings.jet
new file mode 100644
index 0000000..90b1f65
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/about.mappings.jet
@@ -0,0 +1,13 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="AboutMappings" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+0=${build.id}
+1=${git.commit}
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/build.properties.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/build.properties.jet
new file mode 100644
index 0000000..8a1ff98
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/build.properties.jet
@@ -0,0 +1,18 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="BuildProperties" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%@include file="../copyright.properties.jetinc"%>
+
+bin.includes = META-INF/,\
+               about.html,\
+               about.mappings,\
+               fragment.properties,\
+               jre/
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/dot.gitignore.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/dot.gitignore.jet
new file mode 100644
index 0000000..11ab183
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/dot.gitignore.jet
@@ -0,0 +1,13 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="GitIgnore" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+*
+!.gitignore
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/dot.project.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/dot.project.jet
new file mode 100644
index 0000000..a185b77
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/dot.project.jet
@@ -0,0 +1,46 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="ProjectXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Variant variant = (Variant)argument;
+  String os = variant.getOs();
+  String arch = variant.getArch();
+  JVM jvm = variant.getJVM();
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name><%=modelName%>.<%=jvmName%>.<%=os%>.<%=arch%></name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/eclipse.inf.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/eclipse.inf.jet
new file mode 100644
index 0000000..13b9d90
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/eclipse.inf.jet
@@ -0,0 +1,13 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="EclipseInf" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+jarprocessor.exclude.pack = true
+jarprocessor.exclude.children.pack = true
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/fragment.properties.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/fragment.properties.jet
new file mode 100644
index 0000000..319e55f
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/fragment.properties.jet
@@ -0,0 +1,22 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="FragmentProperties" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Variant variant = (Variant)argument;
+String variantLabel = variant.getLabel();
+  JVM jvm = variant.getJVM();
+  String jvmLabel = jvm.getLabel();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+  String provider = model.getProvider();%>
+<%@include file="../copyright.properties.jetinc"%>
+
+providerName = <%=provider%>
+pluginName = <%=modelLabel%> <%=jvmLabel%> for <%=variantLabel%>
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/org.eclipse.pde.prefs.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/org.eclipse.pde.prefs.jet
new file mode 100644
index 0000000..0820a34
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/org.eclipse.pde.prefs.jet
@@ -0,0 +1,13 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="PDEPrefs" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+eclipse.preferences.version=1
+compilers.incompatible-environment=2
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/p2.inf.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/p2.inf.jet
new file mode 100644
index 0000000..6261a30
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/p2.inf.jet
@@ -0,0 +1,29 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet
+  package="org.eclipse.justj.codegen.templates.fragment"
+  class="P2Inf"
+  imports="java.util.* java.util.Iterator org.eclipse.justj.codegen.model.* org.eclipse.justj.codegen.model.util.Generator"
+  builder="StringBuilder builder = new StringBuilder()"
+  minimize="true"%>
+<%Variant variant = (Variant)argument;%>
+<%@include file="../copyright.properties.jetinc"%>
+
+<%Map<String, Set<String>> touchpoints = Generator.getTouchpoints(variant);
+  for (Map.Entry<String, Set<String>> entry : touchpoints.entrySet()) {
+    String phase = entry.getKey();%>
+instructions.<%=phase%> = \
+  <%for (Iterator<String> it = entry.getValue().iterator(); it.hasNext();) {
+      String instruction = it.next();%>
+  <%=instruction%>;<%if (it.hasNext()) {%>\<%}%>
+  <%}%>
+
+<%}%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.codegen/templates/fragment/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/fragment/pom.xml.jet
new file mode 100644
index 0000000..64628ad
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/fragment/pom.xml.jet
@@ -0,0 +1,69 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.fragment" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Variant variant = (Variant)argument;
+  String os = variant.getOs();
+  String arch = variant.getArch();
+  JVM jvm = variant.getJVM();
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName + '.' + os + '.' + arch;
+  String version = jvm.getVersion();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId><%=modelName%></groupId>
+    <artifactId><%=modelName%>.plugins</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/<%=modelName%>.parent/plugins</relativePath>
+  </parent>
+
+  <groupId><%=modelName%></groupId>
+  <artifactId><%=fullName%></artifactId>
+  <version><%=version%>-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>about.mappings</include>
+        </includes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>target-platform-configuration</artifactId>
+        <version>${tycho-version}</version>
+        <configuration>
+          <resolver>p2</resolver>
+          <environments>
+            <environment>
+              <os><%=os%></os>
+              <arch><%=arch%></arch>
+            </environment>
+          </environments>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/MANIFEST.MF.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/MANIFEST.MF.jet
new file mode 100644
index 0000000..2e5daa1
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/MANIFEST.MF.jet
@@ -0,0 +1,26 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="Manifest" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();%>
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: <%=fullName%>;singleton:=true
+Bundle-Version: <%=version%>.qualifier
+Bundle-ClassPath: .
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Automatic-Module-Name: <%=fullName%>
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/about.ini.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/about.ini.jet
new file mode 100644
index 0000000..bb2912b
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/about.ini.jet
@@ -0,0 +1,24 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="AboutIni" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  Model model = jvm.getModel();
+  String providerImageName = model.getProviderImageName();%>
+<%@include file="../copyright.properties.jetinc"%>
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%featureText
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=<%=providerImageName%>
+
+# Property "appName" contains name of the application (translated)
+appName=%featureName
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/about.mappings.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/about.mappings.jet
new file mode 100644
index 0000000..5f3ae40
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/about.mappings.jet
@@ -0,0 +1,13 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="AboutMappings" imports="" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+0=${build.id}
+1=${git.commit}
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/about.properties.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/about.properties.jet
new file mode 100644
index 0000000..aac9ae1
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/about.properties.jet
@@ -0,0 +1,31 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="AboutProperties" imports="org.eclipse.justj.codegen.model.* org.eclipse.justj.codegen.model.util.Generator" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmLabel = jvm.getLabel();
+  String aboutTextExtra = jvm.getAboutTextExtra();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();%>
+<%@include file="../copyright.properties.jetinc"%>
+
+providerName = Eclipse <%=modelLabel%>
+featureName = <%=modelLabel%> <%=jvmLabel%>
+description = Contains the plug-ins and fragments for the <%=jvmLabel%>
+copyright = <%=Generator.getCopyright(argument, "", "\\n\\" + NL)%>\n
+featureName = <%=modelLabel%> <%=jvmLabel%>
+featureText = <%=modelLabel%> <%=jvmLabel%>\n\
+\n\
+Version: {featureVersion}\n\
+Commit: {1}\n\
+Build: {0}\n\
+\n\
+<%=Generator.getCopyright(argument, "", "\\n\\" + NL)%>\n\
+<%=Generator.composeLines(aboutTextExtra, "", "\\n\\" + NL)%>
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/build.properties.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/build.properties.jet
new file mode 100644
index 0000000..6b7947d
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/build.properties.jet
@@ -0,0 +1,23 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="BuildProperties" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  Model model = jvm.getModel();
+  String providerImageName = model.getProviderImageName();%>
+<%@include file="../copyright.properties.jetinc"%>
+
+bin.includes = META-INF/,\
+               about.html,\
+               plugin.properties,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               <%=providerImageName%>
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/dot.project.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/dot.project.jet
new file mode 100644
index 0000000..3b738dd
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/dot.project.jet
@@ -0,0 +1,43 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="ProjectXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name><%=modelName%>.<%=jvmName%></name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/p2.inf.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/p2.inf.jet
new file mode 100644
index 0000000..8a13293
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/p2.inf.jet
@@ -0,0 +1,30 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="P2Inf" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;%>
+<%@include file="../copyright.properties.jetinc"%>
+# Ensure that the applicable implementation fragment gets installed automatically.
+
+<%int count = 0;
+  for (Variant variant : jvm.getVariants()) {
+    ++count;
+    String os = variant.getOs();
+    String arch = variant.getArch();%>
+
+requires.<%=count%>.namespace = org.eclipse.equinox.p2.iu
+requires.<%=count%>.name = <%=fullName%>.<%=os%>.<%=arch%>
+requires.<%=count%>.range = [$version$,$version$]
+requires.<%=count%>.filter = (&(osgi.os=<%=os%>)(osgi.arch=<%=arch%>)(!(<%=modelName%>.buildtime=true)))
+<%}%>
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/plugin.properties.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/plugin.properties.jet
new file mode 100644
index 0000000..1781474
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/plugin.properties.jet
@@ -0,0 +1,20 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="PluginProperties" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmLabel = jvm.getLabel();
+  Model model = jvm.getModel();
+  String modelLabel = model.getLabel();
+  String provider = model.getProvider();%>
+<%@include file="../copyright.properties.jetinc"%>
+
+providerName = <%=provider%>
+pluginName = <%=modelLabel%> <%=jvmLabel%>
diff --git a/plugins/org.eclipse.justj.codegen/templates/plugin/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/plugin/pom.xml.jet
new file mode 100644
index 0000000..c1786d7
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/plugin/pom.xml.jet
@@ -0,0 +1,50 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.plugin" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%JVM jvm = (JVM)argument;
+  String jvmName = jvm.getName();
+  Model model = jvm.getModel();
+  String modelName = model.getName();
+  String fullName = modelName + '.' + jvmName;
+  String version = jvm.getVersion();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId><%=modelName%></groupId>
+    <artifactId><%=modelName%>.plugins</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/<%=modelName%>.parent/plugins</relativePath>
+  </parent>
+
+  <groupId><%=modelName%></groupId>
+  <artifactId><%=fullName%></artifactId>
+  <version><%=version%>-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>about.mappings</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/pom.xml.jet
new file mode 100644
index 0000000..ab85748
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/pom.xml.jet
@@ -0,0 +1,30 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId><%=model.getName()%></groupId>
+  <artifactId>org.eclipse.justj.root</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>releng/<%=model.getName()%>.parent</module>
+  </modules>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/parent/dot.project.jet b/plugins/org.eclipse.justj.codegen/templates/releng/parent/dot.project.jet
new file mode 100644
index 0000000..9fe67e2
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/parent/dot.project.jet
@@ -0,0 +1,35 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.parent" class="ProjectXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name><%=name%>.parent</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/parent/features/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/releng/parent/features/pom.xml.jet
new file mode 100644
index 0000000..c9cf059
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/parent/features/pom.xml.jet
@@ -0,0 +1,96 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.parent.features" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../../../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId><%=name%></groupId>
+    <artifactId><%=name%>.parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <groupId><%=name%></groupId>
+  <artifactId><%=name%>.features</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+<%for (JVM jvm : model.getJVMs()) {%>
+    <module>../../../features/<%=name%>.<%=jvm.getName()%>-feature</module>
+<%}%>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-p2-metadata-default</id>
+            <configuration>
+              <attachP2Metadata>false</attachP2Metadata>
+            </configuration>
+          </execution>
+          <execution>
+            <id>attach-p2-metadata</id>
+            <phase>package</phase>
+            <goals>
+              <goal>p2-metadata</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>pack-and-sign</id>
+      <activation>
+        <property>
+          <name>PACK_AND_SIGN</name>
+          <value>true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.eclipse.cbi.maven.plugins</groupId>
+            <artifactId>eclipse-jarsigner-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>sign</id>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho</groupId>
+            <artifactId>tycho-p2-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/parent/plugins/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/releng/parent/plugins/pom.xml.jet
new file mode 100644
index 0000000..2216739
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/parent/plugins/pom.xml.jet
@@ -0,0 +1,128 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.parent.plugins" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../../../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId><%=name%></groupId>
+    <artifactId><%=name%>.parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <groupId><%=name%></groupId>
+  <artifactId><%=name%>.plugins</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+<%for (JVM jvm : model.getJVMs()) {%>
+    <module>../../../plugins/<%=name%>.<%=jvm.getName()%></module>
+  <%for (Variant variant : jvm.getVariants()) {%>
+    <module>../../../plugins/<%=name%>.<%=jvm.getName()%>.<%=variant.getOs()%>.<%=variant.getArch()%></module>
+  <%}%>
+<%}%>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-source-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-source</id>
+            <goals>
+              <goal>plugin-source</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>pack-and-sign</id>
+      <activation>
+        <property>
+          <name>PACK_AND_SIGN</name>
+          <value>true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.eclipse.tycho.extras</groupId>
+            <artifactId>tycho-pack200a-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>pack200-normalize</id>
+                <goals>
+                  <goal>normalize</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.cbi.maven.plugins</groupId>
+            <artifactId>eclipse-jarsigner-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>sign</id>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho.extras</groupId>
+            <artifactId>tycho-pack200b-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>pack200-pack</id>
+                <goals>
+                  <goal>pack</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho</groupId>
+            <artifactId>tycho-p2-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>attach-p2-metadata</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>p2-metadata</goal>
+                </goals>
+              </execution>
+            </executions>
+            <configuration>
+              <defaultP2Metadata>false</defaultP2Metadata>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/parent/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/releng/parent/pom.xml.jet
new file mode 100644
index 0000000..dfbf6e1
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/parent/pom.xml.jet
@@ -0,0 +1,204 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.parent" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId><%=name%></groupId>
+  <artifactId><%=name%>.parent</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <tycho.scmUrl>scm:git:https://git.eclipse.org/r/p/justj/org.eclipse.justj.git</tycho.scmUrl>
+    <tycho-version>1.6.0</tycho-version>
+    <jarsigner-version>1.1.7</jarsigner-version>
+    <os-jvm-flags/>
+  </properties>
+
+  <pluginRepositories>
+    <pluginRepository>
+      <id>eclipse-maven-releases</id>
+      <url>https://repo.eclipse.org/content/repositories/releases</url>
+    </pluginRepository>
+    <pluginRepository>
+      <id>eclipse-cbi-releases</id>
+      <url>https://repo.eclipse.org/content/repositories/cbi-releases</url>
+    </pluginRepository>
+  </pluginRepositories>
+
+  <repositories>
+    <repository>
+      <id>license-feature</id>
+      <url>http://download.eclipse.org/cbi/updates/license/</url>
+      <layout>p2</layout>
+    </repository>
+  </repositories>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-maven-plugin</artifactId>
+        <extensions>true</extensions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-publisher-plugin</artifactId>
+        <version>${tycho-version}</version>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-maven-plugin</artifactId>
+          <version>${tycho-version}</version>
+          <extensions>true</extensions>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-packaging-plugin</artifactId>
+          <version>${tycho-version}</version>
+          <configuration>
+            <format>'v'yyyyMMdd-HHmm</format>
+            <sourceReferences>
+              <generate>true</generate>
+            </sourceReferences>
+            <timestampProvider>jgit</timestampProvider>
+            <jgit.ignore>pom.xml</jgit.ignore>
+            <jgit.dirtyWorkingTree>warning</jgit.dirtyWorkingTree>
+            <additionalFileSets>
+              <fileSet>
+                <directory>${project.build.outputDirectory}</directory>
+                <includes>
+                  <include>about.mappings</include>
+                </includes>
+              </fileSet>
+            </additionalFileSets>
+          </configuration>
+          <dependencies>
+            <dependency>
+              <groupId>org.eclipse.tycho.extras</groupId>
+              <artifactId>tycho-sourceref-jgit</artifactId>
+              <version>${tycho-version}</version>
+            </dependency>
+            <dependency>
+              <groupId>org.eclipse.tycho.extras</groupId>
+              <artifactId>tycho-buildtimestamp-jgit</artifactId>
+              <version>${tycho-version}</version>
+            </dependency>
+          </dependencies>
+        </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho</groupId>
+            <artifactId>target-platform-configuration</artifactId>
+            <version>${tycho-version}</version>
+            <configuration>
+              <target>
+              </target>
+
+              <!--executionEnvironmentDefault>JavaSE-${javaVersion}</executionEnvironmentDefault-->
+              <includePackedArtifacts>true</includePackedArtifacts>
+              <environments>
+                <environment>
+                  <os>win32</os>
+                  <ws>win32</ws>
+                  <arch>x86_64</arch>
+                </environment>
+                <environment>
+                  <os>macosx</os>
+                  <ws>cocoa</ws>
+                  <arch>x86_64</arch>
+                </environment>
+                <environment>
+                  <os>linux</os>
+                  <ws>gtk</ws>
+                  <arch>x86_64</arch>
+                </environment>
+              </environments>
+              <dependency-resolution>
+                <extraRequirements>
+                  <requirement>
+                    <type>p2-installable-unit</type>
+                    <id>org.eclipse.license.feature.group</id>
+                    <versionRange>0.0.0</versionRange>
+                  </requirement>
+                </extraRequirements>
+                <profileProperties>
+                  <<%=name%>.buildtime>true</<%=name%>.buildtime>
+                </profileProperties>
+              </dependency-resolution>
+            </configuration>
+          </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-source-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho.extras</groupId>
+          <artifactId>tycho-pack200a-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.cbi.maven.plugins</groupId>
+          <artifactId>eclipse-jarsigner-plugin</artifactId>
+          <version>${jarsigner-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho.extras</groupId>
+          <artifactId>tycho-pack200b-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-p2-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho.extras</groupId>
+          <artifactId>tycho-source-feature-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>modules</id>
+      <activation>
+        <property>
+          <name>MAVEN_BUILD</name>
+          <value>!false</value>
+        </property>
+      </activation>
+      <modules>
+        <module>features</module>
+        <module>plugins</module>
+        <module>../<%=name%>.site</module>
+      </modules>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/site/category.xml.jet b/plugins/org.eclipse.justj.codegen/templates/releng/site/category.xml.jet
new file mode 100644
index 0000000..53ed467
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/site/category.xml.jet
@@ -0,0 +1,24 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.site" class="CategoryXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();
+  String label = model.getLabel();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../../copyright.xml.jetinc"%>
+<site>
+<%for (JVM jvm : model.getJVMs()) {%>
+   <feature id="<%=name%>.<%=jvm.getName()%>">
+      <category name="<%=name%>.category"/>
+   </feature>
+<%}%>
+   <category-def name="<%=name%>.category" label="<%=label%>"/>
+</site>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/site/dot.project.jet b/plugins/org.eclipse.justj.codegen/templates/releng/site/dot.project.jet
new file mode 100644
index 0000000..fd80f86
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/site/dot.project.jet
@@ -0,0 +1,35 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.site" class="ProjectXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name><%=name%>.site</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.codegen/templates/releng/site/pom.xml.jet b/plugins/org.eclipse.justj.codegen/templates/releng/site/pom.xml.jet
new file mode 100644
index 0000000..60b6068
--- /dev/null
+++ b/plugins/org.eclipse.justj.codegen/templates/releng/site/pom.xml.jet
@@ -0,0 +1,47 @@
+<%--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+--%>
+<%@jet package="org.eclipse.justj.codegen.templates.releng.site" class="POMXML" imports="org.eclipse.justj.codegen.model.*" builder="StringBuilder builder = new StringBuilder()" minimize="true"%>
+<%Model model = (Model)argument;
+  String name = model.getName();
+  String label = model.getLabel();%>
+<?xml version="1.0" encoding="UTF-8"?>
+<%@include file="../../copyright.xml.jetinc"%>
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId><%=name%></groupId>
+    <artifactId><%=name%>.parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../<%=name%>.parent</relativePath>
+  </parent>
+
+  <groupId><%=name%></groupId>
+  <artifactId><%=name%>.site</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-repository</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+         <groupId>org.eclipse.tycho</groupId>
+         <artifactId>tycho-p2-repository-plugin</artifactId>
+         <version>${tycho-version}</version>
+         <configuration>
+            <repositoryName><%=label%> Build ${build.id}</repositoryName>
+         </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/plugins/org.eclipse.justj.tools/.project b/plugins/org.eclipse.justj.tools/.project
new file mode 100644
index 0000000..0b2eb77
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.tools</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/plugins/org.eclipse.justj.tools/META-INF/MANIFEST.MF b/plugins/org.eclipse.justj.tools/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..43b2e3f
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.justj.tools;singleton:=true
+Bundle-Version: 0.1.0.qualifier
+Bundle-ClassPath: .
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Automatic-Module-Name: org.eclipse.justj.tools
diff --git a/plugins/org.eclipse.justj.tools/about.html b/plugins/org.eclipse.justj.tools/about.html
new file mode 100644
index 0000000..164f781
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/about.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>About</title>
+</head>
+<body lang="EN-US">
+	<h2>About This Content</h2>
+
+	<p>November 30, 2017</p>
+	<h3>License</h3>
+
+	<p>
+		The Eclipse Foundation makes available all content in this plug-in
+		(&quot;Content&quot;). Unless otherwise indicated below, the Content
+		is provided to you under the terms and conditions of the Eclipse
+		Public License Version 2.0 (&quot;EPL&quot;). A copy of the EPL is
+		available at <a href="http://www.eclipse.org/legal/epl-2.0">http://www.eclipse.org/legal/epl-2.0</a>.
+		For purposes of the EPL, &quot;Program&quot; will mean the Content.
+	</p>
+
+	<p>
+		If you did not receive this Content directly from the Eclipse
+		Foundation, the Content is being redistributed by another party
+		(&quot;Redistributor&quot;) and different terms and conditions may
+		apply to your use of any object code in the Content. Check the
+		Redistributor's license that was provided with the Content. If no such
+		license exists, contact the Redistributor. Unless otherwise indicated
+		below, the terms and conditions of the EPL still apply to any source
+		code in the Content and such source code may be obtained at <a
+			href="http://www.eclipse.org/">http://www.eclipse.org</a>.
+	</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.justj.tools/about.ini b/plugins/org.eclipse.justj.tools/about.ini
new file mode 100644
index 0000000..ad04b23
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/about.ini
@@ -0,0 +1,18 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+#
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%featureText
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=justj32.png
+
+# Property "appName" contains name of the application (translated)
+appName=%featureName
diff --git a/plugins/org.eclipse.justj.tools/about.mappings b/plugins/org.eclipse.justj.tools/about.mappings
new file mode 100644
index 0000000..9c84f0a
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/about.mappings
@@ -0,0 +1,2 @@
+0=${build.id}
+1=${git.commit}
diff --git a/plugins/org.eclipse.justj.tools/about.properties b/plugins/org.eclipse.justj.tools/about.properties
new file mode 100644
index 0000000..044951b
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/about.properties
@@ -0,0 +1,38 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+#
+
+providerName = Eclipse JustJ
+featureName = JustJ Tools
+description = Contains the plug-ins and fragments for the Tools
+copyright = Copyright (c) 2020 Eclipse contributors and others.\n\
+\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n\
+\n\
+SPDX-License-Identifier: EPL-2.0\n
+featureName = JustJ Tools
+featureText = JustJ Tools\n\
+\n\
+Version: {featureVersion}\n\
+Commit: {1}\n\
+Build: {0}\n\
+\n\
+Copyright (c) 2020 Eclipse contributors and others.\n\
+\n\
+This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License 2.0\n\
+which accompanies this distribution, and is available at\n\
+https://www.eclipse.org/legal/epl-2.0/\n\
+\n\
+SPDX-License-Identifier: EPL-2.0\n\
+\n\
+Visit http://www.eclipse.org/justj\n\
diff --git a/plugins/org.eclipse.justj.tools/build.properties b/plugins/org.eclipse.justj.tools/build.properties
new file mode 100644
index 0000000..e699607
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/build.properties
@@ -0,0 +1,17 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+#
+
+bin.includes = META-INF/,\
+               about.html,\
+               plugin.properties,\
+               about.ini,\
+               about.mappings,\
+               about.properties,\
+               justj32.png
diff --git a/plugins/org.eclipse.justj.tools/justj32.png b/plugins/org.eclipse.justj.tools/justj32.png
new file mode 100644
index 0000000..b8092a2
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/justj32.png
Binary files differ
diff --git a/plugins/org.eclipse.justj.tools/plugin.properties b/plugins/org.eclipse.justj.tools/plugin.properties
new file mode 100644
index 0000000..fa13ce2
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/plugin.properties
@@ -0,0 +1,12 @@
+# Copyright (c) 2020 Eclipse contributors and others.
+# 
+# This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License 2.0
+# which accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0/
+# 
+# SPDX-License-Identifier: EPL-2.0
+#
+
+providerName = Eclipse JustJ
+pluginName = JustJ Tools
diff --git a/plugins/org.eclipse.justj.tools/pom.xml b/plugins/org.eclipse.justj.tools/pom.xml
new file mode 100644
index 0000000..f2a464f
--- /dev/null
+++ b/plugins/org.eclipse.justj.tools/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.plugins</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../../releng/org.eclipse.justj.tools.parent/plugins</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.tools</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>.</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>about.mappings</include>
+        </includes>
+      </resource>
+    </resources>
+  </build>
+
+</project>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..40d3f96
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.root</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>releng/org.eclipse.justj.tools.parent</module>
+  </modules>
+
+</project>
diff --git a/releng/org.eclipse.justj.tools.parent/.project b/releng/org.eclipse.justj.tools.parent/.project
new file mode 100644
index 0000000..04b438e
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.parent/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.tools.parent</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/releng/org.eclipse.justj.tools.parent/Build JustJ Tools.launch b/releng/org.eclipse.justj.tools.parent/Build JustJ Tools.launch
new file mode 100644
index 0000000..5dd1866
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.parent/Build JustJ Tools.launch
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
+<mapAttribute key="org.eclipse.debug.core.environmentVariables">
+<mapEntry key="JAVA_HOME" value="${maven.build.java.home}"/>
+</mapAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.ui.externaltools.launchGroup"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${maven.build.command}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-D&#13;&#10;clean&#13;&#10;verify"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${project_loc:/org.eclipse.justj.tools.parent}/../.."/>
+</launchConfiguration>
diff --git a/releng/org.eclipse.justj.tools.parent/features/pom.xml b/releng/org.eclipse.justj.tools.parent/features/pom.xml
new file mode 100644
index 0000000..be5c183
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.parent/features/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.tools.parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.features</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>../../../features/org.eclipse.justj.tools-feature</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>default-p2-metadata-default</id>
+            <configuration>
+              <attachP2Metadata>false</attachP2Metadata>
+            </configuration>
+          </execution>
+          <execution>
+            <id>attach-p2-metadata</id>
+            <phase>package</phase>
+            <goals>
+              <goal>p2-metadata</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>pack-and-sign</id>
+      <activation>
+        <property>
+          <name>PACK_AND_SIGN</name>
+          <value>true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.eclipse.cbi.maven.plugins</groupId>
+            <artifactId>eclipse-jarsigner-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>sign</id>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho</groupId>
+            <artifactId>tycho-p2-plugin</artifactId>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/releng/org.eclipse.justj.tools.parent/plugins/pom.xml b/releng/org.eclipse.justj.tools.parent/plugins/pom.xml
new file mode 100644
index 0000000..5478c0b
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.parent/plugins/pom.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.tools.parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>..</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.plugins</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>../../../plugins/org.eclipse.justj.codegen</module>
+    <module>../../../plugins/org.eclipse.justj.codegen.edit</module>
+    <module>../../../plugins/org.eclipse.justj.codegen.editor</module>
+    <module>../../../plugins/org.eclipse.justj.tools</module>
+  </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-source-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-source</id>
+            <goals>
+              <goal>plugin-source</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>pack-and-sign</id>
+      <activation>
+        <property>
+          <name>PACK_AND_SIGN</name>
+          <value>true</value>
+        </property>
+      </activation>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.eclipse.tycho.extras</groupId>
+            <artifactId>tycho-pack200a-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>pack200-normalize</id>
+                <goals>
+                  <goal>normalize</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.cbi.maven.plugins</groupId>
+            <artifactId>eclipse-jarsigner-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>sign</id>
+                <goals>
+                  <goal>sign</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho.extras</groupId>
+            <artifactId>tycho-pack200b-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>pack200-pack</id>
+                <goals>
+                  <goal>pack</goal>
+                </goals>
+              </execution>
+            </executions>
+          </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho</groupId>
+            <artifactId>tycho-p2-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>attach-p2-metadata</id>
+                <phase>package</phase>
+                <goals>
+                  <goal>p2-metadata</goal>
+                </goals>
+              </execution>
+            </executions>
+            <configuration>
+              <defaultP2Metadata>false</defaultP2Metadata>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/releng/org.eclipse.justj.tools.parent/pom.xml b/releng/org.eclipse.justj.tools.parent/pom.xml
new file mode 100644
index 0000000..af0c982
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.parent/pom.xml
@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.tools.parent</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <tycho.scmUrl>scm:git:https://git.eclipse.org/r/p/justj/org.eclipse.justj.git</tycho.scmUrl>
+    <tycho-version>1.6.0</tycho-version>
+    <jarsigner-version>1.1.7</jarsigner-version>
+    <os-jvm-flags/>
+  </properties>
+
+  <pluginRepositories>
+    <pluginRepository>
+      <id>eclipse-maven-releases</id>
+      <url>https://repo.eclipse.org/content/repositories/releases</url>
+    </pluginRepository>
+    <pluginRepository>
+      <id>eclipse-cbi-releases</id>
+      <url>https://repo.eclipse.org/content/repositories/cbi-releases</url>
+    </pluginRepository>
+  </pluginRepositories>
+
+  <repositories>
+    <repository>
+      <id>license-feature</id>
+      <url>http://download.eclipse.org/cbi/updates/license/</url>
+      <layout>p2</layout>
+    </repository>
+    <repository>
+      <id>eclipse-2020-06</id>
+      <url>http://download.eclipse.org/releases/2020-06</url>
+      <layout>p2</layout>
+    </repository>
+  </repositories>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-maven-plugin</artifactId>
+        <extensions>true</extensions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-publisher-plugin</artifactId>
+        <version>${tycho-version}</version>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-maven-plugin</artifactId>
+          <version>${tycho-version}</version>
+          <extensions>true</extensions>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-packaging-plugin</artifactId>
+          <version>${tycho-version}</version>
+          <configuration>
+            <format>'v'yyyyMMdd-HHmm</format>
+            <sourceReferences>
+              <generate>true</generate>
+            </sourceReferences>
+            <timestampProvider>jgit</timestampProvider>
+            <jgit.ignore>pom.xml</jgit.ignore>
+            <jgit.dirtyWorkingTree>warning</jgit.dirtyWorkingTree>
+            <additionalFileSets>
+              <fileSet>
+                <directory>${project.build.outputDirectory}</directory>
+                <includes>
+                  <include>about.mappings</include>
+                </includes>
+              </fileSet>
+            </additionalFileSets>
+          </configuration>
+          <dependencies>
+            <dependency>
+              <groupId>org.eclipse.tycho.extras</groupId>
+              <artifactId>tycho-sourceref-jgit</artifactId>
+              <version>${tycho-version}</version>
+            </dependency>
+            <dependency>
+              <groupId>org.eclipse.tycho.extras</groupId>
+              <artifactId>tycho-buildtimestamp-jgit</artifactId>
+              <version>${tycho-version}</version>
+            </dependency>
+          </dependencies>
+        </plugin>
+          <plugin>
+            <groupId>org.eclipse.tycho</groupId>
+            <artifactId>target-platform-configuration</artifactId>
+            <version>${tycho-version}</version>
+            <configuration>
+              <target>
+              </target>
+
+              <!--executionEnvironmentDefault>JavaSE-${javaVersion}</executionEnvironmentDefault-->
+              <includePackedArtifacts>true</includePackedArtifacts>
+              <environments>
+                <environment>
+                  <os>win32</os>
+                  <ws>win32</ws>
+                  <arch>x86_64</arch>
+                </environment>
+                <environment>
+                  <os>macosx</os>
+                  <ws>cocoa</ws>
+                  <arch>x86_64</arch>
+                </environment>
+                <environment>
+                  <os>linux</os>
+                  <ws>gtk</ws>
+                  <arch>x86_64</arch>
+                </environment>
+              </environments>
+              <dependency-resolution>
+                <extraRequirements>
+                  <requirement>
+                    <type>p2-installable-unit</type>
+                    <id>org.eclipse.license.feature.group</id>
+                    <versionRange>0.0.0</versionRange>
+                  </requirement>
+                </extraRequirements>
+                <profileProperties>
+                  <org.eclipse.justj.buildtime>true</org.eclipse.justj.buildtime>
+                </profileProperties>
+              </dependency-resolution>
+            </configuration>
+          </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-source-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho.extras</groupId>
+          <artifactId>tycho-pack200a-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.cbi.maven.plugins</groupId>
+          <artifactId>eclipse-jarsigner-plugin</artifactId>
+          <version>${jarsigner-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho.extras</groupId>
+          <artifactId>tycho-pack200b-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho</groupId>
+          <artifactId>tycho-p2-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.tycho.extras</groupId>
+          <artifactId>tycho-source-feature-plugin</artifactId>
+          <version>${tycho-version}</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>modules</id>
+      <activation>
+        <property>
+          <name>MAVEN_BUILD</name>
+          <value>!false</value>
+        </property>
+      </activation>
+      <modules>
+        <module>features</module>
+        <module>plugins</module>
+        <module>../org.eclipse.justj.tools.site</module>
+      </modules>
+    </profile>
+  </profiles>
+
+</project>
diff --git a/releng/org.eclipse.justj.tools.releng/JustJ.setup b/releng/org.eclipse.justj.tools.releng/JustJ.setup
new file mode 100644
index 0000000..defdffb
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.releng/JustJ.setup
@@ -0,0 +1,469 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<setup:Project
+    xmi:version="2.0"
+    xmlns:xmi="http://www.omg.org/XMI"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:git="http://www.eclipse.org/oomph/setup/git/1.0"
+    xmlns:jdt="http://www.eclipse.org/oomph/setup/jdt/1.0"
+    xmlns:predicates="http://www.eclipse.org/oomph/predicates/1.0"
+    xmlns:setup="http://www.eclipse.org/oomph/setup/1.0"
+    xmlns:setup.p2="http://www.eclipse.org/oomph/setup/p2/1.0"
+    xmlns:setup.targlets="http://www.eclipse.org/oomph/setup/targlets/1.0"
+    xmlns:setup.workingsets="http://www.eclipse.org/oomph/setup/workingsets/1.0"
+    xsi:schemaLocation="http://www.eclipse.org/oomph/setup/git/1.0 http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/Git.ecore http://www.eclipse.org/oomph/setup/jdt/1.0 http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/JDT.ecore http://www.eclipse.org/oomph/predicates/1.0 http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/Predicates.ecore http://www.eclipse.org/oomph/setup/targlets/1.0 http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/SetupTarglets.ecore http://www.eclipse.org/oomph/setup/workingsets/1.0 http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/models/SetupWorkingSets.ecore"
+    name="justj"
+    label="JustJ">
+  <setupTask
+      xsi:type="setup:EclipseIniTask"
+      option="-Xmx"
+      value="1024m"
+      vm="true">
+    <description>Set the heap space needed to work with the projects of ${scope.project.label}</description>
+  </setupTask>
+  <setupTask
+      xsi:type="setup:ResourceCreationTask"
+      excludedTriggers="STARTUP MANUAL"
+      content="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?>&#xD;&#xA;&lt;section name=&quot;Workbench&quot;>&#xD;&#xA;&#x9;&lt;section name=&quot;org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart&quot;>&#xD;&#xA;&#x9;&#x9;&lt;item value=&quot;true&quot; key=&quot;group_libraries&quot;/>&#xD;&#xA;&#x9;&#x9;&lt;item value=&quot;false&quot; key=&quot;linkWithEditor&quot;/>&#xD;&#xA;&#x9;&#x9;&lt;item value=&quot;2&quot; key=&quot;layout&quot;/>&#xD;&#xA;&#x9;&#x9;&lt;item value=&quot;2&quot; key=&quot;rootMode&quot;/>&#xD;&#xA;&#x9;&#x9;&lt;item value=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;packageExplorer configured=&amp;quot;true&amp;quot; group_libraries=&amp;quot;1&amp;quot; layout=&amp;quot;2&amp;quot; linkWithEditor=&amp;quot;0&amp;quot; rootMode=&amp;quot;2&amp;quot; sortWorkingSets=&amp;quot;false&amp;quot; workingSetName=&amp;quot;&amp;quot;&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;localWorkingSetManager&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;workingSet editPageId=&amp;quot;org.eclipse.jdt.internal.ui.OthersWorkingSet&amp;quot; factoryID=&amp;quot;org.eclipse.ui.internal.WorkingSetFactory&amp;quot; id=&amp;quot;1382792884467_1&amp;quot; label=&amp;quot;Other Projects&amp;quot; name=&amp;quot;Other Projects&amp;quot;/&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;/localWorkingSetManager&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;activeWorkingSet workingSetName=&amp;quot;Other Projects&amp;quot;/&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;allWorkingSets workingSetName=&amp;quot;Other Projects&amp;quot;/&amp;gt;&amp;#x0D;&amp;#x0A;&amp;lt;/packageExplorer&amp;gt;&quot; key=&quot;memento&quot;/>&#xD;&#xA;&#x9;&lt;/section>&#xD;&#xA;&lt;/section>&#xD;&#xA;"
+      targetURL="${workspace.location|uri}/.metadata/.plugins/org.eclipse.jdt.ui/dialog_settings.xml"
+      encoding="UTF-8">
+    <description>Initialize JDT's package explorer to show working sets as its root objects</description>
+  </setupTask>
+  <setupTask
+      xsi:type="setup:VariableTask"
+      name="eclipse.target.platform"
+      value="${eclipse.target.platform.latest}"
+      defaultValue="2020-06"
+      storageURI="scope://Workspace"/>
+  <setupTask
+      xsi:type="setup:StringSubstitutionTask"
+      name="maven.build.java.home"
+      value="${jre.location-1.8}">
+    <description>The location used to specify JAVA_HOME in the External Tools Configurations.</description>
+  </setupTask>
+  <setupTask
+      xsi:type="setup:VariableTask"
+      filter="(osgi.os=win32)"
+      type="FILE"
+      name="maven.build.command"
+      defaultValue="mvn.cmd"
+      label="Maven Command">
+    <description>The absolute path location of the mvn command that will execute mvn on your operating system; it is used in the External Tools Configurations. You may leave the default if you don't intend to do Maven builds.</description>
+  </setupTask>
+  <setupTask
+      xsi:type="setup:VariableTask"
+      filter="(!(osgi.os=win32))"
+      type="FILE"
+      name="maven.build.command"
+      defaultValue="mvn"
+      label="Maven Command">
+    <description>The absolute path location of the mvn command that will execute mvn on your operating system; it is used in the External Tools Configurations. You may leave the default if you don't intend to do Maven builds.</description>
+  </setupTask>
+  <setupTask
+      xsi:type="setup:StringSubstitutionTask"
+      name="maven.build.command"
+      value="${maven.build.command}">
+    <description>The location of the mvn command that will execute mvn on your operating system; it is used in the External Tools Configurations.</description>
+  </setupTask>
+  <project name="jres"
+      label="JREs">
+    <setupTask
+        xsi:type="git:GitCloneTask"
+        id="git.clone.justj"
+        remoteURI="justj/justj">
+      <annotation
+          source="http://www.eclipse.org/oomph/setup/InducedChoices">
+        <detail
+            key="inherit">
+          <value>eclipse.git.gerrit.remoteURIs</value>
+        </detail>
+        <detail
+            key="label">
+          <value>${scope.project.label} Git or Gerrit repository</value>
+        </detail>
+        <detail
+            key="target">
+          <value>remoteURI</value>
+        </detail>
+      </annotation>
+      <description>${scope.project.label}</description>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.targlets:TargletTask">
+      <targlet
+          name="JustJ JREs">
+        <requirement
+            name="*"/>
+        <sourceLocator
+            rootFolder="${git.clone.justj.location}"
+            locateNestedProjects="true"/>
+      </targlet>
+    </setupTask>
+    <stream
+        name="master"
+        label="Master"/>
+  </project>
+  <project name="tools"
+      label="Tools">
+    <setupTask
+        xsi:type="setup:CompoundTask"
+        name="User Preferences">
+      <annotation
+          source="http://www.eclipse.org/oomph/setup/UserPreferences">
+        <detail
+            key="/instance/org.eclipse.jdt.ui/cleanup_settings_version">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.cleanupprofiles">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/cleanup_profile">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.cleanupprofiles.version">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.wst.xml.core/indentationSize">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.wst.xml.core/lineWidth">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.wst.xml.core/indentationChar">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.pde/compilers.p.deprecated">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/formatter_settings_version">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_nls_tags">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.on_save_use_additional_actions">
+          <value>record</value>
+        </detail>
+        <detail
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks">
+          <value>record</value>
+        </detail>
+      </annotation>
+      <setupTask
+          xsi:type="setup:CompoundTask"
+          name="org.eclipse.jdt.core">
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.invalidJavadoc"
+            value="info"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.invalidJavadocTags"
+            value="enabled"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility"
+            value="private"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription"
+            value="no_tag"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation"
+            value="warning"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.core/org.eclipse.jdt.core.compiler.problem.redundantNullCheck"
+            value="warning"/>
+      </setupTask>
+      <setupTask
+          xsi:type="setup:CompoundTask"
+          name="org.eclipse.jdt.launching">
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.launching/org.eclipse.jdt.launching.PREF_COMPILER_COMPLIANCE_DOES_NOT_MATCH_JRE"
+            value="ignore"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.launching/org.eclipse.jdt.launching.PREF_STRICTLY_COMPATIBLE_JRE_NOT_AVAILABLE"
+            value="ignore"/>
+      </setupTask>
+      <setupTask
+          xsi:type="setup:CompoundTask"
+          name="org.eclipse.jdt.ui">
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/cleanup_profile"
+            value="_JustJCleanup"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/cleanup_settings_version"
+            value="2"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup"
+            value="true"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/formatter_profile"
+            value="_JustJCodeFormatter"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/formatter_settings_version"
+            value="19"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.cleanupprofiles"
+            value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?>&#xA;&lt;profiles version=&quot;2&quot;>&#xA;&lt;profile kind=&quot;CleanUpProfile&quot; name=&quot;JustJCleanup&quot; version=&quot;2&quot;>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_autoboxing&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.qualify_static_method_accesses_with_declaring_class&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.always_use_this_for_non_static_method_access&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.organize_imports&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_trailing_whitespaces_ignore_empty&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.lazy_logical_operator&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_directly_map_method&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.format_source_code_changes_only&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.qualify_static_field_accesses_with_declaring_class&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_generated_serial_version_id&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_redundant_semicolons&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_redundant_type_arguments&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unused_imports&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.insert_inferred_type_arguments&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.make_private_fields_final&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_lambda&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.simplify_lambda_expression_and_method_ref&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.always_use_blocks&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_this_for_non_static_field_access_only_if_necessary&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.sort_members_all&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_trailing_whitespaces_all&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_missing_annotations&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unnecessary_array_creation&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.always_use_this_for_non_static_field_access&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.make_parameters_final&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.sort_members&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_private_constructors&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.always_use_parentheses_in_expressions&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unused_local_variables&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.convert_to_enhanced_for_loop&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unused_private_fields&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_redundant_modifiers&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.never_use_blocks&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.number_suffix&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_missing_deprecated_annotations&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_this_for_non_static_field_access&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unnecessary_nls_tags&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.qualify_static_member_accesses_through_instances_with_declaring_class&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_missing_nls_tags&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unnecessary_casts&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_unboxing&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_blocks_only_for_return_and_throw&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.format_source_code&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.convert_functional_interfaces&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_default_serial_version_id&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unused_private_methods&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_trailing_whitespaces&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.make_type_abstract_if_missing_method&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_serial_version_id&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_this_for_non_static_method_access&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_this_for_non_static_method_access_only_if_necessary&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_anonymous_class_creation&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_missing_override_annotations_interface_methods&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unused_private_members&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.make_local_variable_final&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_missing_methods&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.never_use_parentheses_in_expressions&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.qualify_static_member_accesses_with_declaring_class&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.push_down_negation&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_parentheses_in_expressions&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.add_missing_override_annotations&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_blocks&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.make_variable_declarations_final&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.correct_indentation&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.use_var&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;cleanup.remove_unused_private_types&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;/profile>&#xA;&lt;/profiles>&#xA;"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.cleanupprofiles.version"
+            value="2"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/org.eclipse.jdt.ui.formatterprofiles"
+            value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?>&#xA;&lt;profiles version=&quot;12&quot;>&#xA;&lt;profile kind=&quot;CodeFormatterProfile&quot; name=&quot;JustJCodeFormatter&quot; version=&quot;19&quot;>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_ellipsis&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_logical_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_after_imports&quot; value=&quot;2&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.format_javadoc_comments&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indentation.size&quot; value=&quot;4&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.align_with_spaces&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.disabling_tag&quot; value=&quot;@formatter:off&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.continuation_indentation&quot; value=&quot;2&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_enum_constants&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_imports&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_after_package&quot; value=&quot;2&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant&quot; value=&quot;16&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.indent_root_tags&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.enabling_tag&quot; value=&quot;@formatter:on&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_record_components&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration&quot; value=&quot;84&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_logical_operator&quot; value=&quot;20&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_statements_compare_to_block&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration&quot; value=&quot;next_line_shifted&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.line_length&quot; value=&quot;80&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.use_on_off_tags&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_method_body_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_method_declaration&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch&quot; value=&quot;16&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_additive_operator&quot; value=&quot;20&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_relational_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator&quot; value=&quot;20&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_shift_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_block&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_lambda_body&quot; value=&quot;next_line_shifted&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.compact_else_if&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_type_parameters&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration&quot; value=&quot;84&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_compact_loops&quot; value=&quot;16&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_relational_operator&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_unary_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_ellipsis&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_additive_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.format_line_comments&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_record_declaration&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.text_block_indentation&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.align_type_members_on_columns&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_assignment&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_module_statements&quot; value=&quot;16&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration&quot; value=&quot;68&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_conditional_expression&quot; value=&quot;36&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_block_in_case&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.format_header&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_additive_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_method_declaration&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.join_wrapped_lines&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_conditional_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_shift_operator&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines&quot; value=&quot;2147483647&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator&quot; value=&quot;20&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_resources_in_try&quot; value=&quot;80&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_code_block_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.tabulation.size&quot; value=&quot;2&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.format_source_code&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_field&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer&quot; value=&quot;2&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_method&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration&quot; value=&quot;36&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration&quot; value=&quot;16&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_assignment_operator&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_not_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_switch&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.format_html&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_compact_if&quot; value=&quot;20&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_empty_lines&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_type_arguments&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_unary_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_label&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_member_type&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_logical_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration&quot; value=&quot;68&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_semicolon&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_relational_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.format_block_comments&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.indent_tag_description&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_record_constructor&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration&quot; value=&quot;52&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_string_concatenation&quot; value=&quot;20&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_statements_compare_to_body&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_multiple_fields&quot; value=&quot;16&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_array_initializer&quot; value=&quot;end_of_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_logical_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_shift_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration&quot; value=&quot;common_lines&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_shift_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line&quot; value=&quot;one_line_never&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_enum_constant&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.brace_position_for_type_declaration&quot; value=&quot;next_line&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_before_package&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_additive_operator&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line&quot; value=&quot;false&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.join_lines_in_comments&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.comment.indent_parameter_description&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block&quot; value=&quot;0&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.tabulation.char&quot; value=&quot;space&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_relational_operator&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.wrap_before_string_concatenation&quot; value=&quot;true&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.blank_lines_between_import_groups&quot; value=&quot;1&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.lineSplit&quot; value=&quot;180&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation&quot; value=&quot;do not insert&quot;/>&#xD;&#xA;&lt;setting id=&quot;org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch&quot; value=&quot;insert&quot;/>&#xD;&#xA;&lt;/profile>&#xA;&lt;/profiles>&#xA;"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.format_source_code"
+            value="true"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.on_save_use_additional_actions"
+            value="true"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.remove_trailing_whitespaces"
+            value="true"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.remove_unnecessary_nls_tags"
+            value="true"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.jdt.ui/sp_cleanup.use_blocks"
+            value="true"/>
+      </setupTask>
+      <setupTask
+          xsi:type="setup:CompoundTask"
+          name="org.eclipse.pde">
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.pde/compilers.p.deprecated"
+            value="2"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.pde/compilers.p.exec-env-too-low"
+            value="2"/>
+      </setupTask>
+      <setupTask
+          xsi:type="setup:CompoundTask"
+          name="org.eclipse.wst.xml.core">
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.wst.xml.core/indentationChar"
+            value="space"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.wst.xml.core/indentationSize"
+            value="2"/>
+        <setupTask
+            xsi:type="setup:PreferenceTask"
+            key="/instance/org.eclipse.wst.xml.core/lineWidth"
+            value="180"/>
+      </setupTask>
+    </setupTask>
+    <setupTask
+        xsi:type="jdt:JRETask"
+        version="JavaSE-1.8"
+        location="${jre.location-1.8}"
+        name="JRE for JavaSE-1.8">
+      <description>Define the JRE needed to compile and run the Java projects of ${scope.project.label}</description>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.p2:P2Task"
+        label="EMF Tools">
+      <requirement
+          name="org.eclipse.emf.sdk.feature.group"/>
+      <repository
+          url="http://download.eclipse.org/modeling/emf/emf/builds/milestone/latest"/>
+      <description>Install the tools needed in the IDE to work with the source code for ${scope.project.label}</description>
+    </setupTask>
+    <setupTask
+        xsi:type="setup:VariableTask"
+        name="org.eclipse.justj.tools.p2"
+        label="JustJ Tools Repository">
+      <choice
+          value="http://download.eclipse.org/modeling/emf/emf/builds/milestone/latest"
+          label="JustJ Nightly Build Tools Repository"/>
+      <choice
+          value="${git.clone.justj.tools.location|uri}/releng/org.eclipse.justj.tools.site/target/repository"
+          label="JustJ Self-hosted Tools Repository"/>
+      <description>Choose the p2 repository from which to install the JustJ Tools; do not choose the Self-hosted choice until you've done a local Maven build of  'Build JustJ Tools'</description>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.p2:P2Task"
+        label="JustJ Tools">
+      <requirement
+          name="org.eclipse.justj.tools.feature.group"
+          optional="true"/>
+      <repository
+          url="${org.eclipse.justj.tools.p2}"/>
+    </setupTask>
+    <setupTask
+        xsi:type="git:GitCloneTask"
+        id="git.clone.justj.tools"
+        remoteURI="justj/justj.tools">
+      <annotation
+          source="http://www.eclipse.org/oomph/setup/InducedChoices">
+        <detail
+            key="inherit">
+          <value>eclipse.git.gerrit.remoteURIs</value>
+        </detail>
+        <detail
+            key="label">
+          <value>${scope.project.label} Git or Gerrit repository</value>
+        </detail>
+        <detail
+            key="target">
+          <value>remoteURI</value>
+        </detail>
+      </annotation>
+      <description>${scope.project.label}</description>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.targlets:TargletTask">
+      <targlet
+          name="JustJ Tools">
+        <requirement
+            name="*"/>
+        <requirement
+            name="org.eclipse.sdk.feature.group"/>
+        <requirement
+            name="org.eclipse.emf.sdk.feature.group"/>
+        <sourceLocator
+            rootFolder="${git.clone.justj.tools.location}"/>
+        <repositoryList>
+          <repository
+              url="http://download.eclipse.org/modeling/emf/emf/builds/nightly/latest"/>
+          <repository
+              url="http://download.eclipse.org/tools/orbit/downloads/latest-R"/>
+        </repositoryList>
+      </targlet>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.workingsets:WorkingSetTask">
+      <workingSet
+          name="JustJ Tools">
+        <predicate
+            xsi:type="predicates:AndPredicate">
+          <operand
+              xsi:type="predicates:RepositoryPredicate"
+              project="org.eclipse.justj.tools"/>
+        </predicate>
+      </workingSet>
+    </setupTask>
+    <stream
+        name="master"
+        label="Master">
+      <setupTask
+          xsi:type="setup:EclipseIniTask"
+          option="-Doomph.redirection.justj.tools"
+          value="=https://git.eclipse.org/c/justj/justj.tools.git/plain/releng/org.eclipse.justj.tools.releng/JustJ.setup->${git.clone.justj.tools.location|uri}/releng/org.eclipse.justj.tools.releng/JustJ.setup"
+          vm="true">
+        <description>Set an Oomph redirection system property to redirect the logical location of this setup to its physical location in the Git clone.</description>
+      </setupTask>
+    </stream>
+  </project>
+  <project name="website"
+      label="Website">
+    <setupTask
+        xsi:type="git:GitCloneTask"
+        id="git.clone.www.eclipse.org.justj"
+        locationQualifier="www.eclipse.org."
+        remoteURI="www.eclipse.org/justj">
+      <annotation
+          source="http://www.eclipse.org/oomph/setup/InducedChoices">
+        <detail
+            key="inherit">
+          <value>eclipse.git.gerrit.remoteURIs</value>
+        </detail>
+        <detail
+            key="label">
+          <value>${scope.project.label} Git or Gerrit repository</value>
+        </detail>
+        <detail
+            key="target">
+          <value>remoteURI</value>
+        </detail>
+      </annotation>
+      <description>${scope.project.label}</description>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.targlets:TargletTask">
+      <targlet
+          name="JustJ Website">
+        <requirement
+            name="*"/>
+        <sourceLocator
+            rootFolder="${git.clone.www.eclipse.org.justj.location}"
+            locateNestedProjects="true"/>
+      </targlet>
+    </setupTask>
+    <setupTask
+        xsi:type="setup.workingsets:WorkingSetTask"
+        prefix="org.eclipse.justj.website-">
+      <workingSet
+          name="JustJ Website">
+        <predicate
+            xsi:type="predicates:AndPredicate">
+          <operand
+              xsi:type="predicates:RepositoryPredicate"
+              project="www.eclipse.org.justj"/>
+        </predicate>
+      </workingSet>
+      <description>The dynamic working sets for ${scope.project.label}</description>
+    </setupTask>
+    <stream
+        name="master"
+        label="Master"/>
+  </project>
+  <logicalProjectContainer
+      xsi:type="setup:ProjectCatalog"
+      href="index:/org.eclipse.setup#//@projectCatalogs[name='org.eclipse']"/>
+  <description>JustJ provides tools and infrastructure for building JREs.</description>
+</setup:Project>
diff --git a/releng/org.eclipse.justj.tools.site/.project b/releng/org.eclipse.justj.tools.site/.project
new file mode 100644
index 0000000..1bde655
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.site/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.justj.tools.site</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+	<filteredResources>
+		<filter>
+			<id>1396938000000</id>
+			<name></name>
+			<type>10</type>
+			<matcher>
+				<id>org.eclipse.ui.ide.multiFilter</id>
+				<arguments>1.0-projectRelativePath-matches-true-false-target</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
+</projectDescription>
diff --git a/releng/org.eclipse.justj.tools.site/category.xml b/releng/org.eclipse.justj.tools.site/category.xml
new file mode 100644
index 0000000..f1fef57
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.site/category.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<site>
+   <feature id="org.eclipse.justj.tools">
+      <category name="org.eclipse.justj.category"/>
+   </feature>
+   <category-def name="org.eclipse.justj.category" label="JustJ"/>
+</site>
diff --git a/releng/org.eclipse.justj.tools.site/pom.xml b/releng/org.eclipse.justj.tools.site/pom.xml
new file mode 100644
index 0000000..5ce1b2b
--- /dev/null
+++ b/releng/org.eclipse.justj.tools.site/pom.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2020 Eclipse contributors and others.
+
+This program and the accompanying materials
+are made available under the terms of the Eclipse Public License 2.0
+which accompanies this distribution, and is available at
+https://www.eclipse.org/legal/epl-2.0/
+
+SPDX-License-Identifier: EPL-2.0
+-->
+<project
+    xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.eclipse.justj</groupId>
+    <artifactId>org.eclipse.justj.tools.parent</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../org.eclipse.justj.tools.parent</relativePath>
+  </parent>
+
+  <groupId>org.eclipse.justj</groupId>
+  <artifactId>org.eclipse.justj.tools.site</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>eclipse-repository</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+         <groupId>org.eclipse.tycho</groupId>
+         <artifactId>tycho-p2-repository-plugin</artifactId>
+         <version>${tycho-version}</version>
+         <configuration>
+            <repositoryName>JustJ Build ${build.id}</repositoryName>
+         </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>